我正在構建一個草圖,該草圖目前有兩個類;步行者和排放者。隨着時間的推移,步行者隨機執行perlin噪音步行並消失。發射器意味着步行者發射的點,並具有描述發射器位置的PVector「位置」和描述每幀動畫發出的步行者密度的浮動「密度」。爲什麼我的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;
}
}
其實我知道的命名是混亂的,但位置PVector是步行者的位置和位置PVector是發射。我設法通過 walkers.add(新的Walker(新的PVector(position.x,position.y),新的PVector(隨機的(-10,10),隨機的(-10,10)))) ; 而不是通過頭寸批發。 感謝關於隨機數生成的其他建議,我會考慮這個 – niklz
@niklz命名不會讓人困惑。如果你給變量賦予了兩個不同的名字,那並不重要。 **他們指向同一個對象。**改變其中一個改變另一個。您創建一個新的'PVector'的解決方案與我使用'copy()'函數的建議完全相同,只是使用更多的代碼。 :p –
Ooooh正確。謝謝我不知道變量以這種方式工作! – niklz