我正在构建一个草图,该草图目前有两节课。步行者和发射者。步行者会随机进行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));