Как создать шаблон трейлинга при обработке? - PullRequest
1 голос
/ 14 января 2020

Я пытаюсь создать программу, в которой эллипсы вращаются вокруг центрального экрана и добавляют к нему завершающий паттерн. Я использую ArrayList в обработке, чтобы сохранить старый вектор и затем нарисовать его, но это не рендеринг. Или я что-то не так делаю? Часть, где я написал это, находится в нижней части, спасибо.

Particle[] part = new Particle[10];
int len = 10;

void setup(){
  size(1000,1000,P2D);
  //fullScreen();
  for(int i = 0; i < len; i++){
    part[i] = new Particle();
  }
}

void draw(){
  background(255);
  for(int i = 0; i < len; i++){
    part[i].show();
    part[i].update();
    part[i].trail();
  }
}

class Particle{

  float r,angle,d;
  PVector pos = new PVector();
  ArrayList<PVector> history = new ArrayList<PVector>();

  Particle(){
    angle = random(20,360);
    r = random(20,300);
    pos.x = width/2 + cos(angle) * r;
    pos.y = height/2 + sin(angle) * r;
  }

  void show(){
    stroke(0,0,255);
    ellipse(pos.x,pos.y,5,5);
    //line(x,y,width/2,height/2);
  }

  void update(){
    pos.x = width/2 + cos(angle) * r;
    pos.y = height/2 + sin(angle) * r;
    angle += random(0.001,0.01);
  }

  void trail(){
    history.add(pos);

    if(history.size() > 50){
      history.remove(0);
    }

    for(int i = 0; i < history.size(); i++){
      PVector prev = history.get(i);
      ellipse(prev.x,prev.y,5,5);
    }
  }
}

1 Ответ

0 голосов
/ 14 января 2020

Когда вы делаете

history.add(pos);

, вы не создаете новый PVector объект. Вы просто добавляете ссылку на атрибут pos в список массивов history. Когда pos изменяется, тогда все элементы history относятся к pos. Для каждого Particle существует только один PVecor объект.

Создайте copy из pos при добавлении его к history, чтобы решить проблему:

history.add(pos.copy());
...