20

私は1 つの赤いポリゴン50 個のランダムに配置された青いポリゴンを持っています - それらは地理的な2D 空間にあります。赤い多角形とそれに最も近い青い多角形の間の最短距離を見つけるための最速/最速のアルゴリズムは何ですか?

ポリゴンの頂点を構成するポイントを距離をテストするための値として取得するのは、必ずしも最も近いポイントではない可能性があるため、単純なケースではないことに注意してください。

したがって、最終的には、答えは、特異な赤のポリゴンに最も近い青のポリゴンを返す必要があります。

これは思ったより難しいです!

4

13 に答える 13

13

赤いものとすべての青いものとの間の距離を計算し、これらを長さでソートするよりも良い解決策があるとは思えません。

並べ替えに関しては、通常、QuickSort のパフォーマンスに勝るものはありません (最適化されたもので、サイズが 7 項目を下回ると再帰を遮断し、InsertionSort、おそらく ShellSort などに切り替えます)。

したがって、この計算を 50 回行う必要があるため、問題は 2 つのポリゴン間の距離をすばやく計算する方法だと思います。

次のアプローチは 3D でも機能しますが、おそらく最速の方法ではありません。

2D 空間での最小ポリゴン距離

問題は、正確性をスピードと引き換えにする意思があるかどうかです。たとえば、すべてのポリゴンをバウンディング ボックスにパックできます。ボックスの側面は座標系の軸に平行です。3D ゲームでは、このアプローチが頻繁に使用されます。したがって、仮想バウンディング ボックスを構築するには、すべての座標 (x、y、z) の最大値と最小値を見つける必要があります。これらのバウンディング ボックスの距離を計算するのは、非常に簡単な作業です。

座標系の軸に平行ではない、より高度な境界ボックスの画像の例を次に示します。

有向バウンディング ボックス - OBB

ただし、これにより、距離の計算が簡単ではなくなります。距離を知る必要がないため、衝突検出に使用されます。1 つのバウンディング ボックスの 1 つのエッジが別のバウンディング ボックス内にあるかどうかだけを知る必要があります。

次の図は、軸が整列したバウンディング ボックスを示しています。

軸が整列したバウンディング ボックス - AABB

OOB はより正確で、AABB はより高速です。この記事を読みたいと思うかもしれません:

高度な衝突検出技術

これは常に、精度と速度を犠牲にすることをいとわないことを前提としています。速度よりも精度が重要な場合は、より高度な技術が必要になる場合があります。

于 2008-09-17T15:13:56.010 に答える
5

問題を軽減してから、小さなセットで集中的な検索を実行できる場合があります。

最初に各ポリゴンを処理して、次を見つけます。

  • 多角形の中心
  • ポリゴンの最大半径 (つまり、定義された中心から最も遠いポリゴンのエッジ/サーフェス/頂点上の点)

これで、たとえば、赤いポリゴンに最も近い 5 ~ 10 個のポリゴンを収集し (中心から中心までの距離を求め、半径を減算し、リストを並べ替えて上位 5 つを取得します)、さらに徹底的なルーチンを実行できます。

于 2008-09-17T15:19:17.230 に答える
4

GISやゲームアプリケーションなど、境界点の数が適切なポリゴンシェイプの場合、一連のテストを実行する方が簡単な場合があります。

赤いポリゴンの各頂点について、青いポリゴンの各頂点までの距離を計算し、最も近いものを見つけます(ヒント、sqrt()が不要になるようにdistance ^ 2を比較します)最も近いものを見つけて、両側の頂点を確認します見つかった赤と青の頂点を使用して、どの線分が最も近いかを判断し、2つの線分の間で最も近いアプローチを見つけます。

http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline3d/を参照してください (2dの場合は簡単です)

于 2008-09-17T15:07:53.963 に答える
3

たぶん、フレシェ距離はあなたが探しているものですか?

2 つの多角形曲線間のフレシェ距離の
計算 単純な多角形間のフレシェ距離の計算

于 2008-09-17T14:57:08.483 に答える
3

このスクリーニング手法は、結果の精度を損なうことなく、平均的なケースで実行する必要がある距離計算の数を減らすことを目的としています。凸面ポリゴンと凹面ポリゴンで機能します。

赤の頂点と青の頂点の各ペア間の最小距離を見つけます。rと呼びます。ポリゴン間の距離は最大でrです。各線分がrだけ外側に移動し、頂点を中心とする半径rの円弧によって隣接する線分に結合される赤い多角形から新しい領域を構築します。この領域内の各頂点から、この領域と交差する反対色のすべての線分までの距離を見つけます。

もちろん、境界ボックスなどの近似方法を追加して、どの青いポリゴンが赤い領域と交差できないかをすばやく判断することもできます。

于 2008-09-17T19:28:14.977 に答える
2

あなたが「最短距離」と言ったことは知っていますが、あなたは本当に最適な解決策を意味しましたか、それとも「良い/非常に良い」解決策があなたの問題に適していますか?

最適なソリューションを見つける必要がある場合は、すべてのソースと宛先のポリゴン境界(頂点だけでなく)の間の距離を計算する必要があるためです。3D空間にいる場合、各境界は平面です。頂点の数によっては、これは大きな問題になる可能性があります(O(n ^ 2))。

したがって、その平方を恐ろしい数にする頂点数があり、「良い/非常に良い」解が適切である場合は、ヒューリスティックな解または近似を選択してください。

于 2008-09-17T15:44:29.463 に答える
2

まず、すべてのポリゴンを境界円で境界付けてから、最小距離の上限を見つけます。次に、距離の下限が最小距離の上限よりも低いすべての青いポリゴンのエッジを、赤いポリゴンのすべてのエッジに対してチェックします。

最小距離の上限=最小{距離(赤の中心、現在の青の中心)+現在の青の半径}

距離(赤の中心、現在の青の中心)-現在の青の半径<最小距離の上限
    エッジと頂点の距離を確認してください

しかし、それはすべてあなたのデータに依存します。青いポリゴンが赤いポリゴンとの距離に比べて比較的小さい場合、このアプローチはうまく機能するはずですが、非常に近い場合は何も保存されません(多くのポリゴンは十分に近くなります)。そして別のこと-これらのポリゴンに多くの頂点がない場合(それらのほとんどが三角形である場合など)、各赤いエッジを各青いエッジに対してチェックするのとほぼ同じくらい速いかもしれません。

それが役に立てば幸い

于 2009-07-13T14:17:53.610 に答える
2

他の人が境界領域(ボックス、円)を使用すると述べたように、ポリゴンとポリゴンの相互作用の一部を破棄できる場合があります。これにはいくつかの戦略があります。

  1. 青いポリゴンを選び、赤いポリゴンからの距離を見つけます。次に、他のポリゴンを選択します。境界領域間の最小距離がすでに見つかった距離よりも大きい場合は、このポリゴンを無視できます。すべてのポリゴンについて続行します。
  2. 赤いポリゴンとすべての青いポリゴンの間の最小距離/重心距離を見つけます。距離を並べ替えて、最小の距離を最初に検討します。実際の最小距離を計算し、ポリゴン間の最大距離がこれまでに見つかった最小距離よりも大きくなるまで、ソートされたリストを続行します。

円/軸方向に整列されたボックス、または方向付けられたボックスの選択は、入力ポリゴンの実際のレイアウトに応じて、アルゴリズムのパフォーマンスに大きな影響を与える可能性があります。

実際の最小距離の計算には、Yang et alの「ボロノイ図に基づいて2つの互いに素な凸多角形間の距離を計算するための新しい高速アルゴリズム」を使用できます。これはO(log n + log m)です。

于 2009-07-13T15:06:23.343 に答える
2

すぐに葬式に出なければなりませんが、ポリゴンを凸状のサブポリに分割する場合、実行できる最適化がいくつかあります。各ポリゴンでバイナリ検索を実行して、最も近い頂点を見つけることができます。最も近い点は、その頂点または隣接するエッジのいずれかである必要があります。つまりlog(log m * n)、m はポリゴン上の頂点の平均数、n はポリゴンの数です。これはちょっと急いでいるので、間違っている可能性があります。必要に応じて後で詳細を提供します。

于 2009-07-13T15:11:57.110 に答える
2

Voronoi Culling を見たいと思うかもしれません。紙とビデオはこちら:

http://www.cs.unc.edu/~geom/DVD/

于 2008-09-19T00:12:53.490 に答える
1

境界ボックス間の距離を比較することから始めることができます。長方形間の距離をテストすることは、ポリゴン間の距離をテストするよりも簡単で、nearest_rect + its_diagonal よりも離れているポリゴンをすぐに削除できます (さらに細かく調整できる可能性があります)。次に、残りのポリゴンをテストして、最も近いポリゴンを見つけることができます。

ポリゴンの近接性を見つけるためのアルゴリズムがあります - ウィキペディアにはそれらの良いレビューがあると確信しています。私の記憶が正しければ、凸多角形のみを許可するものはかなり高速です。

于 2008-09-17T15:24:20.180 に答える
0

あなたが探しているのは、パスファインディングで使用される A* アルゴリズムだと思います。

于 2010-09-16T15:36:11.487 に答える
-1

単純なアプローチは、赤と 50 個の青のオブジェクト間の距離を見つけることです。つまり、50 個の 3D ピタゴラスの計算と並べ替えを見て、答えを見つけます。ただし、それは中心点間の距離を見つけるためにのみ実際に機能します。

任意のポリゴンが必要な場合は、法線に対して赤いポリゴンの表面から光線を放出し、別のポリゴンがヒットしたときに報告するレイトレーシング ソリューションが最適です。

ハイブリッドが機能する可能性があります -- 中心点からの距離を見つけることができます。青いポリゴンの相対的なサイズについて何らかの概念があると仮定すると、結果セットをそれらの中で最も近いものに選別し、レイトレーシングを使用して真に絞り込むことができます。最も近いポリゴン。

于 2008-09-17T15:06:34.060 に答える