2次元空間にn個の粒子のセットがあり、各粒子がセット内の他のすべての粒子に対して引力を経験し、それらの間の距離の逆2乗に比例すると、経験した正味の力を計算する巧妙な方法を想像できますか? n ^ 2の距離計算を実行せずに、各粒子ごとに?
私のプログラムのParticleクラスから:
public void calculateAttractions(List<Particle> entities)
{
foreach (Particle p in entities)
{
if (!p.Equals(this))
{
Vector2 dx = this.Position - p.Position;
this.ApplyForce(-dx / dx.LengthSquared());
}
}
}
力ずくの方法では、パフォーマンスの問題が発生する前に、(XNAフレームワークとFarseer物理エンジンを使用して)プログラム内で最大150個のパーティクルしかシミュレートできません。
他に方法がない場合、このコードをどのように最適化するか、またはどのようにチートすることができますか?私は、calculateAttractions()の呼び出しをパーティクルごとにランダム化してみました。これにより、いつでもパーティクルの約1/3だけが実際に更新されます。これにより、パフォーマンスがいくらか向上しましたが、もちろん精度が犠牲になりました。
私がやろうとしていることは、重力の計算に似ています。このスレッドの誰かが、複素数を操作して方程式を使用することを提案しました。
(z-z')/abs(z-z')**3
しかし、私はzが何を指しているのかわからず、この方程式への参照を他のどこにも見つけることができません。
編集:私は以下の答えを受け入れましたが、私は誰も言及していない解決策を使用することになりました:ルックアップテーブル。基本的に、私は、任意の方向に最大2000ピクセル離れたすべての距離(1ピクセルの解像度)で別の粒子によって1つの粒子に加えられる力を事前に計算します。その後、実行時の距離を計算せずに力を決定できます。正確な解決策ではありませんが、歪みは認識できず、シミュレーション粒子の数を3倍に増やすことができました(n体問題ではなく物理エンジンによって数が制限されるようになりました)。 )。