2016-04-02 11 views
1

私は現在、理想的なガスの衝突をシミュレートするコードを書いています。この場合の衝突は弾力的です(エネルギーを失うことはありません)。 私は、自分が満たす時間と位置を含め、私が必要とするすべてを計算するコードをすでに書いています。私のクラスの機能では、私は定義:紛らわしい用語についてクラス機能に問題があります。 C++

Particle.cpp

void Particle::collideParticles(Particle particle){ 

    double tCollision; 

    tCollision=timeToCollision(particle); 


    if(tCollision >= 0 && (!testFloat(tCollision,FLT_MAX, 0.1))){ 

     move(tCollision); 
     particle.move(tCollision); 

     Vector r2=particle.getPosition(); 
     Vector r1=p; 
     Vector r0=r2-r1; 
     Vector n=r0.unit(); 
     Vector v1=n; 
     Vector v2=n; 

     v1.Scale(v.dot(n)); 
     v2.Scale(particle.getVelocity().dot(n)); 

     Vector deltaV=v2-v1; 

     setVelocity(v+deltaV); 
     particle.setVelocity(particle.getVelocity()-deltaV); 

    } 

} 

私の謝罪。

  • Vectorは、成分x、y、zを有するクラスを指す。

  • Scale

    は、ベクトル(x、y、z)

  • Unitは単位ベクトルをとるスケーリング。

  • timeToCollisionは、2つのパーティクルが衝突する時間を計算して返す先のクラスの関数です。

  • FLT_MAXの値は<cfloat>です。この例では0とFLT_MAXの範囲内にありません。リストアイテム

私はこのコードを作成しました。しかし、私は

Main.cpp

Vector p1p(0,0,0); 
    Vector p1v(1,0,0); 
    Vector p2p(5,0,0); 
    Vector p2v(0,0,0); 
    Particle p1(1, p1p, p1v); 
    Particle p2(1, p2p, p2v); 

    cout << "Velocity of p1 before collide should be 1 on X, value is: " << p11.getVelocity().GetX() << endl; 
    cout << "Velocity of p2 before collide should be 0 on X, value is: " << p2.getVelocity().GetX() << endl; 

    p1.collideParticles(p2); 

    cout << "Velocity of p1 should be 0 on X, value is: " << p11.getVelocity().GetX() << endl; 
    cout << "Velocity of p2 should be 1 on X, value is: " << p2.getVelocity().GetX() << endl; 

にこの関数を呼び出すときに、私は粒子1のxの点で速度が終了し、1であることを開始すること得る正しいれ、0です。それは粒子2のxの速度が0になることを私に与えてくれますが、衝突後に再び0になります。

これはおそらく私が作った単純な間違いか、私が忘れてしまったものだと感じています。私はそれを見つけられない点を強調しました。どんな助けでも大歓迎です。もっと明瞭に説明されるものを求めてください。

Dan。

+0

あなたの[mcve]を提示してください –

答えて

2

粒子を参照として渡す必要があります。粒子オブジェクトのコピーを渡すだけで、関数が終了すると破壊されます。関数定義の変更:それはあなたの問題を修正する場合、私はわからない

void Particle::collideParticles(Particle particle){ 

} 

void Particle::collideParticles(Particle &particle){ 
} 
+0

それはまさにそれです、ありがとうございます。 –

1

に、しかし、あなたはParticle p2の速度を操作していないcollideParticles(Particle particle)あなたの方法を設計した方法が、しかし、そのオブジェクトのコピーの速度。メソッドをcollideParticles(Particle& particle)に変更してみてください。参照Particle&を使用すると、実際にオブジェクトp2を変更することができます。

関連する問題