これはかなり複雑な問題だと思いますが、私はそれを理解できるように十分小さなスペースに収めることができます。私は現在、コードを書いていますガスパーティクルシミュレーション衝突計算C++
とそれらがどのように衝突するなど このように私の2 paricles用:シミュレーションボックス内の理想気体粒子。 2つのパーティクルが衝突するかどうかを計算しています。パーティクルが最も近いポイントに到達するまでの時間を計算しています。 (彼らが衝突時に頭を持っている例を使用して)。私は、彼らがその後、どのような時に計算する前に、2個の粒子のためにすべてで衝突するかどうか確認する必要があり、コードのこのセクションでは
Main.cpp
Vector vp1(0,0,0);
Vector vv1(1,0,0);
Vector vp2(12,0,0);
Vector vv2(-1,0,0);
Particle Particle1(1, vp1, vv1);
Particle Particle2(1, vp2, vv2);
Particle1.timeToCollision(Particle2);
私がする粒子を定義します。
ヘッダーファイル
は要するにx
、y
、z
値を与える別のクラスです。また、これらを操作するための複数の関数が含まれています。
そして私は.cpp
内、で助けが必要な部分(ETC coutの開始と文字を無視し、彼らは私のコードは、テストのために出て、簡単なチェックです。)
方程式を考えます:
私はすでに私のためのドット積とモジュラスを行うには、コードを書かれています
ここ
s
時間tac
で移動した距離です。
double Particle::timeToCollision(const Particle particle){
Vector r2 = particle.getPosition();
Vector r1 = p;
Vector v2 = particle.getVelocity();
Vector v1 = v;
Vector r0 = r2 - r1;
Vector v = v2 - v1;
double modv;
double tca;
double result = 0;
double bsqr;
modv = getVelocity().modulus();
cout << "start" << endl;
if(modv < 0.0000001){
cout << "a" << endl;
result = FLT_MAX;
}else{
cout << "b" << endl;
tca = ((--r0).dot(v))/v.modulusSqr();
// -- is an overridden operator that gives the negation (eg (2, 3, 4) to (-2, -3, -4))
if (tca < 0) {
cout << "c" << endl;
result = FLT_MAX;
}else{
cout << "d" << endl;
Vector s(v.GetX(), v.GetY(), v.GetZ());
s.Scale(tca);
cout << getVelocity().GetX() << endl;
cout << getVelocity().GetY() << endl;
cout << getVelocity().GetZ() << endl;
double radsqr = radius * radius;
double bx = (r0.GetX() * r0.GetX() - (((r0).dot(v)) *((r0).dot(v))/v.modulusSqr()));
double by = (r0.GetY() * r0.GetY() - (((r0).dot(v)) *((r0).dot(v))/v.modulusSqr()));
double bz=(r0.GetZ() * r0.GetZ() - (((r0).dot(v)) * ((r0).dot(v))/v.modulusSqr()));
if (bsqr < 4 * radsqr) {
cout << "e" << endl;
result = FLT_MAX;
} else {
}
cout << "tca: " << tca << endl;
}
}
cout << "fin" << endl;
return result;
}
私はいくつかの側面を計算するための方程式を持って、tca
は最接近の時間を指します。
私はb > 4 r^2
かどうかを確認するために必要なコードで記述されたように、私はいくつかの試みを行い、b
アウトのX
、Y
とZ
コンポーネントを書かれています。しかし、私はごみの回答を得ています。 私は既に間違いや方向づけをしているかどうかを確認するのに助けが必要です。
これまでのすべてのコードは、予期したとおりに動作していますが、それぞれをチェックするために複数のテストを記述しました。
あなたが感じるあらゆる情報については、コメントでお知らせください私は残してきたなど
大歓迎任意のヘルプ。
何が 'getVelocity()。modulus();'をしているのですか? – Maikel
です。 v – Maikel
のL_2ノルムは、 'double bsqr;'の値を決して決して決してしません。それはランダムな内容を持っています。しかし、あなたは比較 'bsqr <4 * radsqr'を使用します。あなたの正確な出力は何ですか? – Maikel