私は現在、理想的なガスの衝突をシミュレートするコードを書いています。この場合の衝突は弾力的です(エネルギーを失うことはありません)。 私は、自分が満たす時間と位置を含め、私が必要とするすべてを計算するコードをすでに書いています。私のクラスの機能では、私は定義:紛らわしい用語についてクラス機能に問題があります。 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を有するクラスを指す。
は、ベクトル(x、y、z)Scale
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。
あなたの[mcve]を提示してください –