2017-02-28 72 views
4

我一直試圖弄清楚現在幾個小時無濟於事。這是非常簡單的代碼,一個彈跳球(粒子)。將粒子的速度初始化爲(0,0)將保持它上下跳動。顆粒的初始化速度更改爲(0,0.01)或任何十進制浮點將導致球降低用float處理奇怪的問題

Particle p; 

void setup() { 
    size(500, 600); 
    background(0); 
    p = new Particle(width/2, height/2); 

} 

void draw() { 
    background(0, 10); 
    p.applyForce(new PVector(0.0, 1.0)); // gravity 
    p.update(); 
    p.checkBoundaries(); 
    p.display(); 

} 

class Particle { 
    PVector pos, vel, acc; 
    int dia; 

    Particle(float x, float y) { 
    pos = new PVector(x, y); 
    vel = new PVector(0.0, 0.0); 
    acc = new PVector(0.0, 0.0); 
    dia = 30; 
    } 

    void applyForce(PVector force) { 
    acc.add(force); 
    } 

    void update() { 
    vel.add(acc); 
    pos.add(vel); 
    acc.mult(0); 
    } 

    void display() { 
     ellipse(pos.x, pos.y, dia, dia); 
    } 

    void checkBoundaries() { 
    if (pos.x > width) { 
     pos.x = width; 
     vel.x *= -1; 
    } else if (pos.x < 0) { 
     vel.x *= -1; 
     pos.x = 0; 
    } 
    if (pos.y > height) { 
     vel.y *= -1; 
     pos.y = height; 
    } 
    } 
} 

回答

5

我不是在處理矢量的專家,但我相信我已想出爲什麼這是發生。如果嘗試用速度向量的y部分的不同值重新創建此問題,則會發現只有當值不是.5的倍數時纔會發生此問題。在此基礎上,該行很可能是負責:

if (pos.y > height) { 
    vel.y *= -1; 
    pos.y = height; 
} 

此行輪球的高度,並逆轉了它的速度。這個效果很好,當球剛好擊中0並且在球回來之前獲得額外的速度,但是當球稍微低於它應該的時候,來自額外迭代的速度不會被添加。正如它發生的那樣,.5的倍數恰好爲0,但其他值不會。我的證據是,當你改變問題的代碼爲以下,每個值導致球掉在地上,最終:

if (pos.y >= height) { 
    vel.y *= -1; 
    pos.y = height; 
} 

總之,舍入,而不是讓球反彈時,命中0原因這個問題。我希望這能回答你的問題。