【问题标题】:Why does this processing code creates diminishing trail?为什么此处理代码会创建递减轨迹?
【发布时间】:2018-09-12 12:33:43
【问题描述】:

我正在通过Processing学习java。

代码执行以下操作。

1) 调用 Setup 并初始化大小为 700,300 的窗口。

2) 在设置中使用 for 循环初始化多个点,并给出随机速度。

3) 自动调用draw函数。它是一个循环函数。它被一次又一次地调用。它每次都用一个黑色矩形填充空间并绘制所有圆圈并更新它们的位置。

4) 由于 rect() 命令在每次调用 draw() 时都会清屏,所以它必须只显示一个粒子并且没有轨迹。但确实如此。

偶然看到其中一篇教程,代码如下

Spot[] spots; // Declare array
void setup() {
  size(700, 100);
  int numSpots = 70; // Number of objects
  int dia = width/numSpots; // Calculate diameter
  spots = new Spot[numSpots]; // Create array
  for (int i = 0; i < spots.length; i++) {
    float x = dia/2 + i*dia;
    float rate = random(0.1, 2.0);
    // Create each object
    spots[i] = new Spot(x, 50, dia, rate);
  }
  noStroke();
}
void draw() {
  fill(0, 12);
  rect(0, 0, width, height);
  fill(255);
  for (int i=0; i < spots.length; i++) {
    spots[i].move(); // Move each object
    spots[i].display(); // Display each object
  }
}
class Spot {
  float x, y;         // X-coordinate, y-coordinate
  float diameter;     // Diameter of the circle
  float speed;        // Distance moved each frame
  int direction = 1;  // Direction of motion (1 is down, -1 is up)

  // Constructor
  Spot(float xpos, float ypos, float dia, float sp) {
    x = xpos;
    y = ypos;
    diameter = dia;
    speed = sp;
  }

  void move() {
    y += (speed * direction); 
    if ((y > (height - diameter/2)) || (y < diameter/2)) { 
      direction *= -1; 
    } 
  }

  void display() {
    ellipse(x, y, diameter, diameter);
  }
}

它产生这个输出:

我不明白为什么它会创建这些轨迹,而这些轨迹会消失。直观地说,应该只有一个点是可见的,因为

for (int i=0; i < spots.length; i++) {
spots[i].move(); // Move each object
spots[i].display(); // Display each object
}

请指出导致这种情况发生的代码行?我不知道。

参考:https://processing.org/tutorials/arrays/ @Arrays:Casey Reas 和 Ben Fry

【问题讨论】:

  • 我认为你真的应该包括一些最小的文字描述这段代码应该做什么。只需丢下一堆代码和一张点图……然后告诉我们:去其他地方阅读详细信息……这不是一个好主意。
  • 1.删除rect(0, 0, width, height); 看看会发生什么。 2. 在draw 的开头添加background(0); 再看看会发生什么。
  • 是的,它确实删除了踪迹。所以我想正在发生的事情是 alpha = 12 不断增加并最终使圆圈消失。每帧只绘制一个圆圈。

标签: java arrays oop processing blending


【解决方案1】:

场景永远不会被清除,因此在新帧中将新点添加到场景中时,之前帧中绘制的点仍然存在。

说明

fill(0, 12);
rect(0, 0, width, height);

在整个视图上绘制一个透明的黑色矩形。所以前几帧的斑点似乎随着时间的推移而淡出。由于“较旧”的斑点已经被透明矩形覆盖了很多次,它们变成了深灰色。 “较年轻”的斑点只被覆盖了几次,呈浅灰色。立即绘制的点是白色的,因为白色填充颜色(fill(255);

如果你增加混合矩形的 alpha 值,那么斑点会“消失”得更快,它们的“尾巴”会更短。

例如

fill(0, 50);

【讨论】:

    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2017-01-16
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多