Почему этот код обработки создает убывающий след? - PullRequest
0 голосов
/ 12 сентября 2018

Я учу Java через обработку.

Код выполняет следующие действия.

1) Программа установки вызывается и инициализируется окно размером 700 300.

2) Ряд точек инициализируется с помощью цикла for в настройке и задаются случайные скорости.

3) Функция рисования вызывается автоматически. Это функция зацикливания. Он вызывается снова и снова. Каждый раз он заполняет пространство черным прямоугольником и рисует все круги вместе с обновлением их позиций.

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);
  }
}

Он производит такой вывод:

enter image description here

Я не понимаю, почему это создаст эти следы, и эти следы просто исчезнут. Интуитивно, из-за

должна быть видна только одна точка
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/ @ Массивы: Кейси Реас и Бен Фрай

1 Ответ

0 голосов
/ 12 сентября 2018

Сцена никогда не очищается, поэтому точки, нарисованные в предыдущих кадрах, все еще остаются при добавлении новых точек на сцену в новом кадре.

Инструкции

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

Нарисуйте прозрачный черный прямоугольник на всем виде.Таким образом, пятна предыдущих кадров, кажется, со временем исчезают.Поскольку «старые» пятна были покрыты прозрачным прямоугольником на майские времена, они становятся темно-серыми.«Младшие» пятна просто покрыты несколько раз и выглядят светло-серыми.Пятна, которые были нарисованы немедленно, являются белыми, потому что цвет белой заливки (fill(255);)

Если вы увеличите значение альфа прямоугольника смешивания, то пятна будут "исчезать" быстрее и их "хвост""будет короче.

например

fill(0, 50);
...