2017-02-15 68 views
1

我正在構建一個草圖,該草圖目前有兩個類;步行者和排放者。隨着時間的推移,步行者隨機執行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; 
    } 

} 

回答

1

我有兩個問題。第一個也是最嚴重的問題是,由於某種原因,我的發射器類中的位置PVector隨着時間的推移而變化(看起來好像我以某種方式使它也隨機行走)。這是怎麼發生的?在emit()方法中注意我有一個註釋行,它每次強制使用相同的PVector,並且這種行爲可以按照預期進行。

你已經完全描述了這個問題。你傳遞的position變量您Walker類,然後Walker類正在改變PVector在這條線:

location.add(step); 

既然你改變傳入的變量,你改變原來position變量。這就是爲什麼它可以正常工作,如果你通過一個不同的PVector實例。

要解決此問題,您可能需要查看PVector類的copy()函數。更多信息可在the reference中找到。

第二個問題是,步行者似乎傾向於偏北偏北,而且似乎鬆散地束縛在一個正方形中。

廣場正在發生,因爲你的最大邊界是一個正方形。考慮你的職位可能採取的最大可能值。這形成一個正方形,所以如果你在這個正方形中有一堆位置,你就會開始看到正方形。要解決這個問題,你必須使用一些基本的三角函數來最大化一個圓。基本上:存儲標題和速度,然後使用cos()sin()來計算位置。谷歌是你的朋友。

如果您發現它們朝着某個方向移動,那意味着您的隨機數生成已關閉。嘗試了分裂這一行成多個步驟,以追查正是這種偏見來自:

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

其實我知道的命名是混亂的,但位置PVector是步行者的位置和位置PVector是發射。我設法通過 walkers.add(新的Walker(新的PVector(position.x,position.y),新的PVector(隨機的(-10,10),隨機的(-10,10)))) ; 而不是通過頭寸批發。 感謝關於隨機數生成的其他建議,我會考慮這個 – niklz

+0

@niklz命名不會讓人困惑。如果你給變量賦予了兩個不同的名字,那並不重要。 **他們指向同一個對象。**改變其中一個改變另一個。您創建一個新的'PVector'的解決方案與我使用'copy()'函數的建議完全相同,只是使用更多的代碼。 :p –

+0

Ooooh正確。謝謝我不知道變量以這種方式工作! – niklz

相關問題