1

Java を使用して多数の 2 次元の「ボール」(円) をモデル化 (および表示) する必要があるアプリケーションを作成しています。ArrayListオブジェクトの作成から始めましたCircle(私が定義したクラスで、円の中心の x/y ピクセル座標、半径、色、および x & y 方向の速度を持ちます)。円の動きを制御するためにjava.util.Timer、繰り返しのあるオブジェクトを使用します。TimerTask円のサイズは、半径 10 ~ 50 ピクセル程度です。

私がやりたいことは、ボールが画面の上部から (x 軸にランダムに分散されて) 落下し、床のように機能する画面の下部に到達することです。リーチ ストップ ボールは他のボールの上を下り坂を転がり、低い/平らな場所に止まるまで転がります。将来的には、動作をもう少し複雑にしたいかもしれないので、簡単に拡張できるように柔軟なコードを作成したいと考えています。現在の仕組みは、各サークルが他のすべてのサークルにどれだけ近いかを時間枠ごとにチェックすることです。近くに他の円がない場合、それらは通常どおり落下し続けます。2 つ (またはそれ以上) の円が互いに近接している場合、それらがどのように相互作用するかを決定するコードがあります。

少数の円 (< 200) では完全に機能しますが、多数の円 (> 400) を取得すると、速度が大幅に低下し始めます。いくつかのロジックを最適化して比較を少し高速化できると確信していますが、組織化されていないもの以外に円を何らかの構造に保存する方法があるかどうか疑問に思っていましたArrayListこれにより、互いに近い円を簡単に見つけることができるため、各円を他のすべての円と比較する N^2 操作を行う必要はなく、円を最も近い 5 ~ 10 個の円と比較するだけです。それに。たとえば、2D 配列を使用してすべてのピクセル (または 5x5 ピクセルの正方形) を表し、その中心に円を格納することを検討しました (そのため、近くのセルに円があるかどうかを確認し、休み)。ただし、500 個の円を含む 800x1000 ピクセルのキャンバスを使用している場合、2 次元配列に 1 トンの空のスペースがあり、チェックに時間を浪費するため、これはまだかなり非効率的です。ある種のハッシュマップも検討しましたが、それを使用する優れた方法も考えていませんでした。

では、これらの円を 2 次元空間での位置に対応させ、近くの円を見つけやすくする効率的な方法を考えられる人はいますか? 前もって感謝します!

4

2 に答える 2

1

QuadTree を使用して、近くにあるものを見つけることができます。または、単純に一方向でソートすることもできます。これは、実装がはるかに簡単で、候補の近隣の数を小さなウィンドウに減らすことができるはずです。

于 2012-07-26T22:06:36.040 に答える
1

おそらく、2D 配列についてのあなたの考えはそれほどクレイジーではありません。あなたが望むのは、すべての円の 1 つのリストと、円も参照する 2D 配列です。そのため、毎回、繰り返し処理してList<Circle>それぞれを確認できます。各円には x,y 座標があり、(x,y +/- 5) の配列をループするだけで済みます。すでに各円の中心を追跡しているため、円の可能なスペース全体を確認する必要はありません。中心をつかみ、その周りに他の円がないか確認してください。

于 2012-07-26T22:14:35.410 に答える