《目的》
衝突シミュレーションプログラムを組みたいです。
・長方形内に球を任意個数を生成し、それぞれに方向と速度を持たせる
・とある時間が経過した後の位置を計算する
(ビリヤードシミュレーションのようなプログラムを想定)
《思考途中の案》
1)経過時間後の球のベクトルを計算し、ベクトルをリストに登録
2)どれか一つのベクトル(Aとする)を選ぶ
3)ベクトルAと最初に交わる他のベクトル(Bとする)を調べる、交わらないならば2へ
4)Bのベクトルが最初に交わるベクトルがAでないならばBをAに置き換え3へ
5)A、Bのベクトルの衝突後のベクトルを計算し、ベクトルリストに登録する
6)交わるベクトルが無くなるまで2へ
《問題点》
球の個数が少ないうちは総当り的なロジックでも良いが、多くなると計算量が増えて重くなる(万単位)。
そこで、参考になる効率の良いアルゴリズムはないでしょうか?
実装しているサンプルなどありましたら、教えてください。
また、このような問題についてマルチスレッドで処理する方法などありますか?
C、C++、C#、Javaのサンプルですと嬉しいです。
よろしくお願いいたします。
ライフゲームというのをご存知だろうか?
その中にグライダー(一定方向に移動する)といのがあるのだけれども
そのアルゴリズムが流用できると思う。
ライフゲームだと衝突で変形したり合体したりしてしまうのだけれども
ビリヤードのように反発させるようにプログラムを変えれば・・・。
定番の方法は、空間を分割しておき、各分割空間(cell)にどのオブジェクトが居るかをトラックしておくことです。衝突の可能性があるのは自分と同じcellにいるオブジェクトだけなので、調べる組み合わせの数が劇的に減ります。また、複数のスレッドで別々のcellを調べて行くこともできます。
プリンストン大学の宿題問題です。下の方に Cell method という記述がありますね。
http://www.springerlink.com/content/0h5pf2gfp1hak0nr/
これは教科書。
ライフゲームについて調べてみました。
私が求めている球の衝突アルゴリズムとは違うようでした…。
しかしライフゲームのルールが理解できたので、思わぬ収穫です。
コメントありがとうございました。
http://mtrenouf.googlepages.com/simulationresults
各分割空間はこのジャンルでは有効な方法みたいですね。
この方法を取り入れることにより、随分判定回数が減ることが分かりました。
ぜひ、空間分割は採用したいと思っています。
コメントありがとうございました。