2017-02-28 8 views
4

私はこれを数時間は利用しないようにしています。それは非常に単純なコード、跳ねるボール(粒子)です。パーティクルの速度を(0、0)に初期化すると、パーティクルが上下にバウンスします。 (0、0.01)、または任意の10進浮動小数点へのパーティクルの初期化速度を変更すると、私は処理ベクトルの専門家ではないよボールが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部分の異なる値でこの問題を再現しようとすると、値が0.5の倍数でない場合にのみ発生することがわかります。それに基づいて、この行はおそらく責任がある:

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

この行は、ボールの高さを丸め、およびそれの速度を反転させます。これは、ボールが0に正確に当たって戻ってくる前に余分なベロシティが得られたときにうまく動作しますが、ボールが少し下がったときに余分な反復から来るベロシティは加算されません。それが起こると、.5の倍数は正確に0になりますが、他の値は0になりません。それが0原因この問題に当たったときのボールの跳ね返りを作る丸めず、要するに

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

:私の証明では、次の問題のコードを変更すると、すべての値は、ボールが最終的に地面に落下する原因となるということです。これがあなたの質問に答えたことを願っています