ラインセグメントコンテナの高速線の交差点?(2D)
-
06-09-2019 - |
質問
い線については親権者の方の同意が必要望に最も近いラインセグメントでオーサリングツールです。できると思うんこO(log n)時間まうのラインセグメントがどうかよろしくお願いしますどのように並べ替えを与えています。と思い、何らかのツリーにとって最も有効であるというものですか?選別しているの両方の開始と終了点?いても迅速に対処このデータ構造が可能です。
あのコードを一線vs一線セグメントは、何かに一線vs多くのラインセグメント...どうなるかはわからない条件です。
リンクを適切な条は、C++のコードがある場合があるとなお良い。よろしく!:)
PS:のラインセグメントの実際のエッジの自己交差するポリゴン、ソートされCCW注文---私がするように設計されている利点を選別して別のストッキングがあります。
これらはすべて2Dです。
第二思い全く は 可能です。ある種の空間分割がいかなる貢献ができるかもなうには思えるためのソートを行うなどを比較することが可能となる任意の。
解決
ポリゴンの境界ボックス (最小値と最大値の X、Y 座標) を取得し、ボックス内にグリッドを構築できます。次に、各セルについて、そのセルを横切るすべての線を覚えておきます。
次のような交点を見つけます。
- 光線が最初に当たるセルを調べます (O(1))
- 使用 グリッドトラバーサルアルゴリズム グリッドを通して光線を「描画」します。空ではないセルに到達したら、そのすべての行をチェックし、セル内に交差があるかどうかを確認し、最も近い交差を選択します。すべての交点がセルの外側にある場合は、続行します (これは O(グリッドの長さ))。
グリッドを階層化することもできます。 四分木 - あなたが求めていた木)、同じアルゴリズムを使用してそれを歩きます。 これは 3D のレイトレーシングで行われます 時間計算量は O(sqrt(N)) です。
または、レイトレーサーで行ったアプローチを使用します。
- を建てる 四分木 ラインを含む (クアッドツリーの構築については記事で説明しています) - ノード (= エリア) に含まれるオブジェクトが多すぎる場合は、ノード (= エリア) を 4 つのサブノード (サブエリア) に分割します。
すべて集める リーフノード 光線が当たる四分木の例:
ルートの光線と四角形の交差 (難しくありません) を計算します。ルートが光線に当たった場合は、その子を再帰的に処理します。
これのすごいところは、ツリー ノードが ない ヒットしました。サブツリー全体 (大きな長方形の領域である可能性があります) の処理をスキップしました。
結局のところ、これはグリッドを横断することと同じです。光線のパス上の最小のセルを収集し、そのセル内のすべてのオブジェクトの交差をテストします。すべてをテストして、最も近い交差点を選択するだけです (つまり、光線のパス上のすべての線を探索することになります)。
これは O(sqrt(N)) です。
グリッド トラバーサルでは、交差点を見つけたら検索を停止できます。これをクアッドツリートラバーサルで実現するには、子を正しい順序で検索する必要があります。4 つの四角形の交差を距離でソートするか、4 セルのグリッドを賢くトラバースします (トラバーサルに戻ります)。
これは単なる別のアプローチですが、実装が比較的難しいのは同じだと思いますが、うまく機能します(実際のデータ - O(sqrt(N)) でテストしました)。繰り返しますが、このアプローチの恩恵を受けるのは少なくとも数本のラインがある場合のみです。ポリゴンに 10 個のエッジがある場合、すべてのエッジをテストすることと比較したメリットはほとんどないと思います。
他のヒント
ソートはO(n個のnを記録)動作時の最高であることに留意してください。あなただけ個別にチェックしたほうが良いことがあります。
どのようにあなたがそれらのいずれかを打つだろうと確信していますか?彼らはラインであれば、それはそうだ。
それは本当にあなたがテストしようとしているポリゴン(すなわち平面)なら、、この種のものを行うための通常の方法は、内外/用(2D座標で)その点をテストし、第一の平面と交差していますポリゴンます。
たぶん私はあなたが実際にやっていることを誤解しています。
複雑な図面と一般加速交差点では、空間分割(その後、あなたのテストは高価である場合、メイルボックスのような技術)で行われます。
[アップデート:私は本来の意図読み違え]あなたはまだ使用することができます(2D)空間分割をしかし、オーバーヘッドはそれだけの価値はないかもしれません。あなたのポリゴンは、それだけで、それらを歩いて安くなるかもしれない複雑されていない場合は、個々のテストでは、安いです。説明から言うのは難しいます。
説明を求めますが、これは正しいですか?
- 動的な線分のセットがあります L.
- クエリ:与えられた どれでも 点 (x,y) と どれでも この点からの光線の方向に最も近い線を決定したいとします。 L (もしあれば)?
ということは、点(x,y)は固定されていないのでしょうか?(任意の点、任意の方向でよいでしょうか?)