我正在构建一个草图,该草图目前有两节课。步行者和发射者。步行者会随机进行Perlin噪音行走,并随时间逐渐消失。发射器是指发射步行者的点,并具有描述发射器位置的PVector“位置”和描述每动画帧发射的步行者密度的浮点“密度”。

我有两个问题。第一个也是最严重的问题是,由于某种原因,我的发射器类中的PVector位置会随时间变化(看起来好像我在某种程度上也使其随机行走)。这是怎么回事?请注意,在generate()方法中,我有一条注释行,该注释行每次都强制使用相同的PVector,这完全可以按预期工作。

第二个问题是,步行者似乎倾向于在偏北的方位上漂移,而且似乎被束缚在正方形中。我不知道是什么原因导致了这种行为,所以您将不胜感激。

干杯!

码:

ArrayList<Walker> walkers;
ArrayList<Emitter> emitters;
int tmax = 1200;
int stepSize = 2;

int nWalkers = 50;

void setup(){
  size(1024,1024);
  frameRate(60);
  walkers = new ArrayList<Walker>();
  emitters = new ArrayList<Emitter>();
  emitters.add(new Emitter(new PVector(width/2, height/2), 0.5));



}


void draw() {

  for (Emitter e: emitters){
  e.emit();
  }

  fill(255, 50); // alpha will control fade-out (agaaaaaaaaaaaaaaaaaaaaaaaaaaaaaain)
  noStroke();
  rect(0, 0, width, height); // Creates fading tail for walkers


  for(int i = walkers.size() - 1; i>=0; i--){
    Walker w = (Walker) walkers.get(i);
    if(w.time > tmax) {
    walkers.remove(i);

    }
    w.walk();
    w.displayline();


  }

}

class Emitter {
  PVector position;
  float density;

  Emitter(PVector positionIni,  float densityIni) {
  position = positionIni;
  density = densityIni;

  }

  void emit() {

    if(random(1000) > map(density, 0, 1, 0, 1000)) {
      walkers.add(new Walker(position, new PVector(random(-10,10), random(-10,10)))); // DOESN'T WORK
      //walkers.add(new Walker(new PVector(width/2, height/2), new PVector(random(-10,10), random(-10,10))));
    }
  }


}



class Walker {
  PVector location, plocation;
  PVector noff, step;
  int time;

  Walker(PVector locationIni, PVector noffIni) {
    location = locationIni;
    plocation = new PVector(location.x, location.y);
    noff = noffIni;
    step = new PVector(map(noise(noff.x), 0, 1, -stepSize, stepSize), map(noise(noff.y), 0, 1, -stepSize, stepSize));
    time = 0;
  }

  void displayline() {
    strokeWeight(1);
    fill(map(time, 0, tmax, 0, 255));
    stroke(map(time, 0, tmax, 0, 255));
    //ellipse(location.x, location.y,1,1);
    line(plocation.x, plocation.y,location.x, location.y);
    time++;

  }
  void walk() {


    plocation.x = location.x;
    plocation.y = location.y;

    step.x = map(noise(noff.x), 0, 1, -stepSize, stepSize);
    step.y = map(noise(noff.y), 0, 1, -stepSize, stepSize);

    location.add(step);

    noff.x += 0.05;
    noff.y += 0.05;
  }

}

最佳答案

我有两个问题。第一个也是最严重的问题是,由于某种原因,我的发射器类中的PVector位置会随时间变化(看起来好像我在某种程度上也使其随机行走)。这是怎么回事?请注意,在generate()方法中,我有一条注释行,该注释行每次都强制使用相同的PVector,这完全可以按预期工作。


您已经准确地描述了问题。您将position变量传递给Walker类,然后Walker类在此行中更改PVector

location.add(step);


由于您要更改传入的变量,因此要更改原始的position变量。这就是为什么如果传入不同的PVector实例,它可以正常工作的原因。

若要解决此问题,您可能需要查看copy()类的PVector函数。可以在the reference中找到更多信息。


  第二个问题是,步行者似乎倾向于在偏北的方位上漂移,而且似乎被束缚在正方形中。


因为您的最大界限是一个正方形,所以发生了正方形。考虑一下您的头寸可以采用的最大可能值。那形成一个正方形,因此,如果在那个正方形中有一堆位置,您将开始看到正方形。要解决此问题,您必须使用一些基本的三角函数来使最大值变成一个圆。基本上:存储航向和速度,然后使用cos()sin()计算位置。 Google是您的朋友。

如果您发现它们朝一个方向移动,则意味着您的随机数生成已关闭。尝试将此行分成多个步骤,以准确跟踪该偏差的来源:

step = new PVector(map(noise(noff.x), 0, 1, -stepSize, stepSize), map(noise(noff.y), 0, 1, -stepSize, stepSize));

10-04 18:16