为什么我的PVector应保持不变,在此草图中进行修改

时间:2017-02-15 11:41:51

标签: java processing

我正在建立一个草图,目前有两个类;步行者和发射者。步行者随意进行perlin-noise步行并随着时间的推移淡出。发射器是指助行器发射并具有PVector位置的点。描述发射器位置和浮子密度'描述每帧动画发射的步行者的密度。

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

第二个问题是步行者似乎倾向于在东北方向上漂移,而且似乎在一个正方形中松散地束缚。我不知道是什么导致了这种行为,所以任何见解都会非常感激。

干杯!

CODE:

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

}

1 个答案:

答案 0 :(得分:1)

  

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

您已完全描述了问题。您已将position变量传入Walker班级,然后Walker班级正在更改此行中的PVector

location.add(step);

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

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

  

第二个问题是,步行者似乎倾向于在东北方向上漂移,而且似乎在一个正方形中松散地束缚。

正方形正在发生,因为你的最大界限是一个正方形。考虑您的头寸可能采取的最大可能值。形成一个正方形,所以如果你在那个方格中有一堆位置,你就会开始看到方形。要解决这个问题,你必须使用一些基本的三角函数来代替最大值。基本上:存储标题和速度,然后使用cos()sin()计算位置。谷歌是你的朋友。

如果您发现它们向一个方向移动,则表示您的随机数生成已关闭。尝试将此行拆分为多个步骤,以准确追踪偏差的来源:

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