精华内容
下载资源
问答
  • Processing利用基本图形制作简单动图

    千次阅读 2021-03-11 14:00:33
    之后重启我们的Processing,在我们菜单栏速写本中出现GifAnimation 下面直接使用即可,代码如下: import gifAnimation.*; GifMaker gif; float minScale = 0.5; //单个圆最小放大倍数 float maxScale = 4; //最大...

    效果图:
    在这里插入图片描述

    需要用到外部的gifAnimation库,用于导出gif文件,下载好gifAnimation库之后将其解压到速写本所在目录下的libraries下,如图:
    在这里插入图片描述
    之后重启我们的Processing,在我们菜单栏速写本中出现GifAnimation
    在这里插入图片描述
    下面直接使用即可,代码如下:

    import gifAnimation.*;
    GifMaker gif;
    
    float minScale = 0.5; //单个圆最小放大倍数
    float maxScale = 4;	//最大放大倍数
    float currentScale = 1;//当前图形放大倍数
    
    void setup() {
        size(500,500); //画布大小
        noFill(); //不要填充颜色
        strokeWeight(0.5);//边框粗细
        stroke(250,6,8);//线条颜色,我随便调的
        setup_(); //运行我们生产gif部分的代码
    } 
     void draw() {
        background(255); //绘制图案的背景
        translate(100,100);
       
        for(int y = 0;y <= 300; y += 30){
          for(int x = 0; x <= 300; x += 30){
            
            pushMatrix();
            translate(x,y);
            rectMode(CENTER);
            rotate(radians(frameCount));
            currentScale = map(sin((frameCount + (x-y))/60.0),-1,1,minScale,maxScale);
            scale(currentScale);
            ellipse(15,15,10,10);
            popMatrix();
          }
        }
        draw_();
        
    } 
    void setup_(){
      gif = new GifMaker(this,"gif.gif");
      gif.setRepeat(0);//设置gif重复播放的次数,0为循环播放
      gif.setDelay(40);//设置帧与帧之间的延迟时间,单位为毫秒,数值为40 帧率为25
    }
    void draw_(){
      if(frameCount % 5 == 0){
        gif.addFrame();//当前帧写入gif内
      }
      if(frameCount == 185)
      gif.finish();
    }
    void mousePressed(){
      gif.finish();//点击鼠标导出gif
    }
    

    点击运行,得到如下结果:
    在这里插入图片描述
    点击一下,在我们的processing文件下找到生成的gif图片
    在这里插入图片描述

    展开全文
  •  (背景图片) This example presents the fastest way to load a background image into Processing. To load an image as the background, it must be the same width and height as the program. 此示例介绍将...

    1、Load and Display(加载与显示)

    Images can be loaded and displayed to the screen at their actual size or any other size.

    图像可以按照其实际尺寸或任何其他尺寸加载并显示到屏幕。

    PImage img; //Declare variable "a" of type PImage

    voidsetup() {

    size(640, 360);//The image file must be in the data folder of the current sketch//图片文件必须在当前草稿文件的同一文件夹才能加载成功。//to load successfully

    img = loadImage("moonwalk.jpg"); //Load the image into the program

    }voiddraw() {//Displays the image at its actual size at point (0,0)

    image(img, 0, 0);//Displays the image at point (0, height/2) at half of its size

    image(img, 0, height/2, img.width/2, img.height/2);

    }

    View Code

    2、Background Image. (背景图片)

    This example presents the fastest way to load a background image into Processing. To load an image as the background, it must be the same width and height as the program.

    此示例介绍将加载背景图像的最快方法转换到Processing。 要加载图像作为背景,它必须与程序的宽度和高度相同。

    PImage bg;inty;voidsetup() {

    size(640, 360);//The background image must be the same size as the parameters//into the size() method. In this program, the size of the image//is 640 x 360 pixels.

    bg = loadImage("moonwalk.jpg");

    }voiddraw() {

    background(bg);

    stroke(226, 204, 0);

    line(0, y, width, y);

    y++;if (y >height) {

    y= 0;

    }

    }

    View Code

    3、透明度。

    向左移动,指针对面的形象改变立场。本方案通过用色调()函数修改图像的α值覆盖在另一个图象。

    PImage img;float offset = 0;float easing = 0.05;voidsetup() {

    size(640, 360);

    img= loadImage("moonwalk.jpg"); //Load an image into the program

    }voiddraw() {

    image(img,0, 0); //Display at full opacity

    float dx = (mouseX-img.width/2) -offset;

    offset+= dx *easing;

    tint(255, 127); //Display at half opacity

    image(img, offset, 0);

    }

    View Code

    4、遮罩

    为图像加载“遮罩”以指定图像不同部分的透明度。 使用Image的mask()方法将两个图像混合在一起。

    PImage img;

    PImage imgMask;voidsetup() {

    size(640, 360);

    img= loadImage("moonwalk.jpg");

    imgMask= loadImage("mask.jpg");

    img.mask(imgMask);

    imageMode(CENTER);

    }voiddraw() {

    background(0, 102, 153);

    image(img, width/2, height/2);

    image(img, mouseX, mouseY);

    }

    View Code

    5、创建图像。

    createImage()函数提供了一个新的像素的缓冲区。 此示例创建图像渐变。

    PImage img;voidsetup() {

    size(640, 360);

    img= createImage(230, 230, ARGB);for(int i = 0; i < img.pixels.length; i++) {float a = map(i, 0, img.pixels.length, 255, 0);

    img.pixels[i]= color(0, 153, 204, a);

    }

    }voiddraw() {

    background(0);

    image(img,90, 80);

    image(img, mouseX-img.width/2, mouseY-img.height/2);

    }

    View Code

    6、点画

    鼠标水平位置控制点的大小。 使用根据图像中的像素着色的椭圆创建简单的点画效果。

    PImage img;intsmallPoint, largePoint;voidsetup() {

    size(640, 360);

    img= loadImage("moonwalk.jpg");

    smallPoint= 4;

    largePoint= 40;

    imageMode(CENTER);

    noStroke();

    background(255);

    }voiddraw() {float pointillize = map(mouseX, 0, width, smallPoint, largePoint);int x = int(random(img.width));int y = int(random(img.height));

    color pix=img.get(x, y);

    fill(pix,128);

    ellipse(x, y, pointillize, pointillize);

    }

    View Code

    7、请求图像由Ira Greenberg(从为Flash开发人员处理)。

    展示如何使用requestImage()函数与preloader动画。 requestImage()函数在单独的线程上加载图像,以使草图在加载时不会冻结。 当你加载大图片时,它非常有用。这些图像是小的快速下载,但尝试应该大的图像,以获得完整的效果。

    int imgCount = 12;

    PImage[] imgs= newPImage[imgCount];floatimgW;//Keeps track of loaded images (true or false)

    boolean[] loadStates = new boolean[imgCount];//For loading animation

    floatloaderX, loaderY, theta;voidsetup() {

    size(640, 360);

    imgW= width/imgCount;//Load images asynchronously

    for (int i = 0; i < imgCount; i++){

    imgs[i]= requestImage("PT_anim"+nf(i, 4)+".gif");

    }

    }voiddraw(){

    background(0);//Start loading animation

    runLoaderAni();for (int i = 0; i < imgs.length; i++){//Check if individual images are fully loaded

    if ((imgs[i].width != 0) && (imgs[i].width != -1)){//As images are loaded set true in boolean array

    loadStates[i] = true;

    }

    }//When all images are loaded draw them to the screen

    if(checkLoadStates()){

    drawImages();

    }

    }voiddrawImages() {int y = (height - imgs[0].height) / 2;for (int i = 0; i < imgs.length; i++){

    image(imgs[i], width/imgs.length*i, y, imgs[i].height, imgs[i].height);

    }

    }//Loading animation

    voidrunLoaderAni(){//Only run when images are loading

    if (!checkLoadStates()){

    ellipse(loaderX, loaderY,10, 10);

    loaderX+= 2;

    loaderY= height/2 + sin(theta) * (height/8);

    theta+= PI/22;//Reposition ellipse if it goes off the screen

    if (loaderX > width + 5){

    loaderX= -5;

    }

    }

    }//Return true when all images are loaded - no false values left in array

    booleancheckLoadStates(){for (int i = 0; i < imgs.length; i++){if (loadStates[i] == false){return false;

    }

    }return true;

    }

    View Code

    展开全文
  • Processing使用

    2021-05-29 15:34:43
    推荐一个特别好用的Java绘图工具Processing 可以非常方便的使用Java高性能绘制2D,3D图形 特别方便做一些可视化项目(例如算法可视化) 二维动态深度优先 三维动态深度优先遍历 3维动态生命游戏 最后附加上我的学习...

    推荐一个特别好用的Java绘图工具Processing
    可以非常方便的使用Java高性能绘制2D,3D图形
    特别方便做一些可视化项目(例如算法可视化)
    二维动态深度优先
    在这里插入图片描述
    三维动态深度优先遍历
    在这里插入图片描述
    3维动态生命游戏
    在这里插入图片描述
    最后附加上我的学习项目地址:
    https://gitee.com/shaokang123/processing-test

    展开全文
  • 我们来看下原理的动态演示 每次 draw 中的半透明矩形的半透明度,目前设置是20(0~255的范围),决定着残影的停留时长,设置的越低,叠加的越慢,半透明叠加到完全不透明需要的时间就越长,残影停留时间就越长。...

    残影拖尾效果实现思路分析

    今天小菜给大家分享下实现残影、拖尾效果的几种实现思路,或者叫固定套路,保准大家认真看完后,以后再也不怕实现残影、拖尾效果了。

    本文字数比较多,且部分内容需要阅读代码加以思考,预计阅读10-15分钟。(画外音:小菜好不容易总结的,客官读完有收获再走呀,😂)

    残影

    啥是残影?小菜直接上图说明。
    封面图
    封面图
    在这里插入图片描述
    游戏人物挥剑动作

    在这里插入图片描述
    游戏人物冲刺动作
    在这里插入图片描述
    李小龙经典镜头

    我们经常在影视剧、游戏中,看到残影的镜头。有武器特效方面的,也有人物动作方面的。看到这里想必大家应该了解到了什么是残影了吧。

    小菜用白话描述下:

    有一个运动的物体,在一段时间内,从这个位置运动到了那个位置,在我们看到的某个画面时间点上,却展示了物体在前一小段时间内的物体运动位置轨迹,这些轨迹往往以半透明的方式展现出来(还有其他表现形势,如上面的游戏中人物冲刺动作的残影),营造出视觉残留效果,起到不错的观赏效果。

    拖尾

    拖尾又是啥?顾名思义,拖动尾巴,尾巴跟随的效果,拖尾常常可以和残影一起说,因为残影效果往往伴随着拖尾,就是物体运动着,在之前历史时间点的位置轨迹也会展现出来,不断的消失,不断的跟随。

    但拖尾也可以单独拎出来说,不说残影效果,只说尾巴的跟随效果。我们今天的例子也会讲到。

    拖尾效果1

    https://www.bilibili.com/video/BV1gB4y1u7th/

    拖尾效果2

    https://www.bilibili.com/video/BV1oh411Y75a/

    常用套路

    下面我们用 Processing 来实现残影、拖尾效果,分析下如何实现。小菜将套路总结成三个:

    1)半透明叠加法

    2)生命流逝法

    3)中学生班级晨跑法

    套路1-半透明叠加法

    void setup() {
      size(800, 800);
      background(0);
      noStroke();
    }
    
    void draw() {
      fill(0, 20);
      rect(0, 0, width, height);
    
      fill(30, 255, 255);
      circle(mouseX, mouseY, 50);
    }
    

    我们运行下看下效果

    在这里插入图片描述

    代码简单的不能再简单了,但却能实现了一种残影拖尾效果。是不是很神奇?

    我们来分析下这个残影的实现原理:

    1)黑色的画布背景

    2)一个跟随鼠标运动的圆,填充色RGB为30,255,255

    3)每一次 draw 绘制时,都会在画布上画一层和画布背景颜色的一样,但具有一定透明度的长方形(一般和画布大小一致)

    如果去掉了第三步,效果是什么样?

    void draw() {
      fill(30, 255, 255);
      circle(mouseX, mouseY, 50);
    }
    

    很明显,我们在画布上不断的画圆,原来的圆会一直停留在画布上。所以随着我们鼠标的运动,会形成一个圆按照鼠标运行轨迹叠加出来的一个画面。

    在这里插入图片描述

    那我们清除下画布呢?每次在 draw 中都填充下背景色,可以将之前画的圆全部擦除掉

    void draw() {
      background(0); // 每一次绘制,都填充下背景色
      fill(30, 255, 255);
      circle(mouseX, mouseY, 50);
    }
    

    在这里插入图片描述

    因为每一次绘制都把画布填充了下,会把原来绘制的圆给擦除掉,所以最终呈现的效果如上 gif 图效果。

    好了。不清除画布,会导致圆按照轨迹不断叠加,形成一条圆组成的“线条“。填充背景色清除画布,会只看到一个圆跟随鼠标运动。

    关键的地方来了,我们每次填充一个半透明画布大小的矩形会怎么样呢?会发生什么神奇的效果?残影 is comming!

    一句话讲清原理:不断叠加的半透明矩形会越来越不透明,历史的圆圈轨迹,在半透明矩形叠加的情况下,会慢慢的消失(渐隐),跟着鼠标运动不断新绘制出来的圆,也会被后面叠加的半透明矩形给渐渐的隐藏掉。

    我们来看下原理的动态演示

    在这里插入图片描述

    每次 draw 中的半透明矩形的半透明度,目前设置是20(0~255的范围),决定着残影的停留时长,设置的越低,叠加的越慢,半透明叠加到完全不透明需要的时间就越长,残影停留时间就越长。

      fill(0, 20); // 20的透明度
      rect(0, 0, width, height);
    

    我们把 20 改成 60 看看,效果比较明显:

    在这里插入图片描述
    透明度20

    在这里插入图片描述
    透明度60

    套路2-生命流逝法

    小菜再次尝试用一段话来描述原理:生命流逝法使用的是面向对象编程的方式,将运动的圆抽象成一个生命体,这个生命体诞生的时候具有 255 的生命值(刚好和透明度对应),随着时间的推移,这个生命体的生命也在不断流逝,降低到 0 后就会死亡,而生命体的生命值会反映在它的透明度上。

    Talk is cheap, show me the code!

    ArrayList<Mover> movers = new ArrayList<Mover>();
    
    void setup() {
      size(600, 600);
      colorMode(RGB);
      background(0);
    }
    
    void draw() {
      background(0);
      for (int i = movers.size() - 1; i >= 0; i--) {
        Mover mover = movers.get(i);
        mover.run();
        if (mover.isDead()) {
          movers.remove(i);
        }
      }
    }
    
    void mouseDragged() {
      movers.add(new Mover(mouseX, mouseY, 50));
    }
    
    // Mover是生命体
    class Mover {
      float x;
      float y;
      float radius;
      float life;
    
      Mover(float x, float y, float radius) {
        this.x = x;
        this.y = y;
        this.radius = radius;
    
        this.life = 255;
      }
    
      void run() {
        update();
        display();
      }
    
      void update() {
        life -= 12;
        life = max(life, 0);
      } 
    
      boolean isDead() {
        if (life <= 0.0) { 
          return true;
        } else {
          return false;
        }
      }
    
      void display() {
        fill(30, 255, 255, life); 
        noStroke();
        circle(x, y, radius);
      }
    }
    

    我们描述下代码思路:

    1)我们在鼠标按下的时候,生成一个生命体,生命体诞生于鼠标的位置,生命刚出生255岁,我们将生命体加入到数组中
    2)我们在每一帧的绘制中,遍历生命体数组,让生命体的生命流逝,生命流逝会导致透明度逐渐降低到0,变得透明不可见(update函数)
    3)我们在每一帧的绘制中,遍历生命体数组,检查生命体是否死亡,死亡的判断依据就是生命值小于等于0,当生命体死亡的时候,我们把生命体从数组中移除,避免数组无限增大,做无谓的遍历与绘制 (isDead函数)
    4)我们在每一帧的绘制中,遍历生命体数组,绘制生命体的样子(display函数)
    5)记得每一帧用背景色填充,将之前的绘制擦除掉,因为不再需要。在当前帧中,有所有生命体的位置和透明度信息,可以将他们全部绘制出来

    在这里插入图片描述

    我们可以在 display 函数中额外显示下生命体的生命值:

    void display() {
        fill(30, 255, 255, life); 
        noStroke();
        circle(x, y, radius);
    
        fill(255);
        text(life, x, y);
      }
    

    运行下
    在这里插入图片描述

    生命体这里都是固定的生命流逝速度,update函数中每次流逝12点生命,调整流逝速度,会直接影响残影的停留时长。先诞生的生命体,先死亡,后诞生的后死亡,于是就有了上图的效果。

    套路3-中学生班级晨跑法

    这个套路常常用于实现拖尾效果。

    小菜想了很久,怎么用通俗易懂的语言来描述这个原理。最终想到了上高中时,班级晨跑锻炼的场景。班级晨跑有以下几个特点:

    1)班级的人数固定了,比如是30个同学
    2)假设晨跑纵队是一列(为了贴近代码演示,咱们的晨跑是一个纵队,上学的时候一般纵队是2-3列,不然队伍太长了),队首同学不断的绕操场跑圈,队首不断的在更新位置(跟随鼠标)
    3)队伍中除了队首同学,每个同学只需要跟着前面一个同学跑就行了,看着前一个同学的后脑勺,下一步将要跑到的位置就是前一个同学的位置

    // 中学生班级晨跑法
    
    int num = 100; // 100个同学
    int[] x = new int[num];
    int[] y = new int[num];
    
    void setup() {
      size(600, 600);
      noStroke();
      fill(255, 100);
    }
    
    void draw() {
      background(0);
    
      // 从尾巴到头部,每个节点位置更新成上一个节点的位置
      // 在此帧绘制中,每一个同学的位置是上一个同学的位置
      for (int i = num - 1; i > 0; i--) {
        x[i] = x[i - 1];
        y[i] = y[i - 1];
      }
    
      // 队首同学跑步,跟着鼠标跑
      x[0] = mouseX;
      y[0] = mouseY;
    
      for (int i = 0; i < num; i++) {
        // 越靠前的位置,圆圈越大,越靠后,尾巴越小
        ellipse(x[i], y[i], (num - i) / 2, (num - i) / 2);
        // 越靠前的位置,圆圈越小,越靠后,尾巴越大
        //ellipse(x[i], y[i], i / 2, i / 2);
        // 所有圆圈固定大小
        //ellipse(x[i], y[i], 30, 30);
      }
    }
    

    在这里插入图片描述

    至此,小菜分享了3种实现套路,你经常用哪种呢?不妨留言😄

    小菜与老鸟后期会不定期更新一些 Processing 绘制的代码思路分析,欢迎关注不迷路。关注后,在公众号菜单页面,输入“残影”获取文中源代码以及扩展代码。

    如果有收获,能一键三连么?

    展开全文
  • Processing创意编程(入门篇)

    千次阅读 2021-12-12 15:32:10
    } } 运行效果如下: 更多基础语法可以参考其他资料: 《processing的基础语法》 模调整式 小技巧:速写本->调整模式运行,运行起来后,鼠标移动到draw函数内的值上,可以动态调整更新画布效果。 胡调一通后效果如下...
  • 很早以前大概13、14年就通过清华大学付志勇教授了解到了Processing这个工具,起初只是初步了解并没有下定决心学习(当初资料太少了)。由于当时只是初步的看了看,所以很多内容和知识点都是一知半解的。虽然15年曾在...
  • 很早以前大概13、14年就通过清华大学付志勇教授了解到了Processing这个工具,起初只是初步了解并没有下定决心学习(当初资料太少了)。由于当时只是初步的看了看,所以很多内容和知识点都...
  • var uac= m_Camera.gameObject.AddComponent<UniversalAdditionalCameraData>(); uac.renderPostProcessing = true;
  • Unity Post-processing后处理笔记 后期处理效果和效果的应用方式取决于所使用的渲染管线,且与其他渲染管线不兼容。这里暂时仅列出Unity的通用渲染管线URP下的一些效果及相关内容的学习笔记
  • CpT: Convolutional Point Transformer for 3D Point Cloud Processing文章信息摘要问题思路方法平台验证参考 文章信息 摘要 我们介绍了CpT:Convolutional point Transformer–一种新的深度学习体系结构,用于处理...
  • learning Scheduling Algorithms for Data Processing Clusters1.introduction2.Motivation2.12.22.3 spark案例的解说3,spark中DAG调度问题4,概述和设计挑战5.设计5.1 可扩展的状态信息处理5.2,将调度决策编码为...
  • 现有的平台库(例如MKL和cuDNN)针对给定的形状和大小动态选择适当的算法。 B. 用于加速器的节能数据流 略 6. 近数据处理 略 7. DNN模型与硬件的联合设计 略 8. 用于DNN评估的评测指标及其比较 略 9. 总结 近几年来,...
  • 分类部分: mlp_head:使用 LayerNorm 和两层全连接层实现的,采用的是GELU激活函数 ViT的动态过程: 整个流程: 一个图片256x256,分成了64个32x32的patch; 对这么多的patch做embedding,成64个1024向量; 再拼接...
  • 比如说,你想创造一个抽象画,设计一些简单矢量动画、动态图形或特效,可以用Processing语言。比如你想把表格里数据以视觉的形式展现出来,可以用Processing语言。比如你想做一些带有美感和抽象意味的模型图,也...
  •   (2)在连续帧之间交错提取深层次特征和浅层次特征,仅在关键帧上提取深度特征和在其他帧上提取的浅层特征通过级联、递归网络或更复杂的动态核蒸馏进行融合。   缺点:造成关键帧和其他帧之间的精度差距。  ...
  • Invertible Image Signal Processing [pdf]
  • 转载自:论文阅读:Natural Language Processing Advancements By Deep Learning: A Survey 深度学习在自然语言处理中的进展 一、介绍 自然语言处理(NLP)是计算机科学的一个分支,它可以帮助机器理解、处理和分析...
  • iOS打包报错-IPA Processing failed 项目中之前用到了一个广告的sdk,后来由于新增了需求,需要升级sdk方可满足。但是升级后,debug调试运行没问题。打测试包的时候一直报错。如下图: 查看报错日志如下: ...
  • 更新xcode12之后真机和模拟器运行正常,打包报错IPA processing failed ,进一步查看日志发现如下错误: Assertion failed: Expected 4 archs in otool output:后面说的是你的某一个framework (不出意外的话应该是...
  • 最小的编辑距离可以通过动态编程来计算。 N-gram本身也指一个由N 个单词组成的集合,各单词具有先后顺序,且不要求单词之间互不相同。常用的有 Bi-gram (N = 2 N=2N=2) 和 Tri-gram (N = 3 N=3N=3),
  • 动态图,压缩有质量损失 完整代码和注释 main.pde 主程序的逻辑,主要分为以下几个部分: 记录鼠标的轨迹 根据鼠标轨迹的前后位置(方向向量)来添加新的粒子,并更新已存在粒子的状态 序列化以上这些数据...
  • IEEE Transactions on Image Processing文献跟踪 2021年9月 • 30卷 • 第9期 文献名/代码/相关性 方向 对象 实验方式 工作 亮点 ...
  • 简介:本篇内容包含三部分展开介绍Stream Processing with Apache Flink:1、并行处理和编程范式;2、DataStream API概览及简单应用;3、 Flink 中的状态和时间。 作者|崔星灿 本篇内容包含三部分展开介绍Stream...
  • Auto Exposure 自动曝光 理解自动曝光,首先要理解曝光。 笔者理解的曝光是:光进入眼睛/镜头的过程,这个过程包含光的...自动曝光效果根据图像包含的亮度级别范围来动态调整图像的曝光。这种调整会逐渐进行,因此可
  • 音频模块结构总结:AudioDeviceModule(adm),AudioEncoderFactory->AudioEncoder,AudioDecoderFactory->AudioDecoder,AudioProcessingFacfoty->AudioProcessing
  • 由于数据源产生数据的速度不可预测,所以流处理系统对动态性要求很高、需要适应能力。 本文方法 采用两种机制来扩展运行时的动态适应性: automatic elasticity and stateful migration 1.自动弹性: 在框架层面:...
  • 背景业务系统在应用过程中,有时候要处理“经常变化”的部分,这部分需求可能是“业务规则”,也可能是“不同的数据处理逻辑”,这部分动态规则的问题,往往需要可配置,并对性能和实时性有一定要求。Java不是解决...
  • LightSeq的技术亮点主要在于定制的Operation、动态GPU内存复用和层级的解码优化,本文对这三方面分别做个粗浅的介绍。 论文链接:https://arxiv.org/pdf/2010.13887.pdf 1 定制的Operation 大多数深度学习框架...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,351
精华内容 22,940
关键字:

processing动态