オブジェクトのリストがある場合
リスト内のすべてのオブジェクトのすべての位置がある場合、すべての空の正方形を検索する必要がなく、2D距離計算を実行して最も近い正方形を決定できるため、これははるかに簡単です。オブジェクトのリストをループして、次のように距離を計算します。
Define your two points. Point 1 at (x1, y1) and Point 2 at (x2, y2).
xd = x2-x1
yd = y2-y1
Distance = SquareRoot(xd*xd + yd*yd)
次に、距離が最も短いものを選択します。
2Dアレイしかない場合
ただし、説明した問題が、最初にすべてのオブジェクトを検索しないとオブジェクトの場所を一覧表示できない2D配列を想定している場合は、スパイラルループを実行する必要があります。
「スパイラル検索方法」を検索すると、いくつかの興味深いリンクが表示されます。 配列の周りでスパイラルループを実行するコードを次に示します。ただし、これは任意のポイントからは機能せず、外側に向かってスパイラルしますが、目的を達成するための優れたアイデアが得られるはずです。
これは、2D配列でスパイラル順序で値を入力することについての同様の質問です。
とにかく、これが私が問題に取り組む方法です:
与えられた点P
で、の周りの領域を指定するベクトルペアを作成しますP
。
したがって、もしP = 4,4
あなたのベクトルペアは3,3|5,5
それらの境界で各値をループします。
for x = 3 to 5
for y = 3 to 5
check(x,y)
next
next
値が見つかった場合は、終了します。そうでない場合は、境界をもう一度1つ増やします。したがって、この場合、2,2|6,6に移動します
ループして値をチェックするときは、負のインデックスが作成されていないことを確認し、配列のサイズを超えていないことも確認してください。
また、境界をn回拡張する場合は、外側の境界値をループするだけでよく、内側の値を再チェックする必要はありません。
どちらの方法が速いですか?
それはすべて以下に依存します:
アレイの密度
2つのオブジェクトを含む500x500の配列がある場合、リストをループすると、スパイラルを実行するよりも常にパフォーマンスが向上します。
配布手法
分散のパターンがある場合(つまり、オブジェクトが互いにクラスター化する傾向がある場合)、スパイラルのパフォーマンスが向上する可能性があります。
オブジェクトの数
リスト手法ではすべての距離をチェックして計算する必要があるため、100万個のオブジェクトがある場合、スパイラルのパフォーマンスはおそらく速くなります。
リストソリューションは毎回すべてのオブジェクトをチェックする必要があるという事実と比較して、スペースが埋められる確率を計算することにより、最速のソリューションを計算できるはずです。
ただし、リスト手法を使用すると、パフォーマンスを向上させるためにスマートな並べ替えを実行できる場合があります。おそらく調べる価値があります。