一連の線のすべての交点を見つけ、O(n log n) 時間ですべての交点を含む最小の四角形を計算するアルゴリズムを見つけようとしています。これまでのところ、双対性と凸包に関係していると推測していますが、実際にこの問題を解決するのにどのように役立つかについてはちょっと固執しています。
誰かがこれについて考えているなら、私に知らせてください。ありがとう :)
三角形の 3 つの交点を最小限に制限するボックス B[0] から始めましょう。
三角形が見つからない場合は、個別に処理できる次の特殊なケースのいずれかになります。
したがって、これらのケースは詳細として無視し、三角形を見つけることができ、それを見つけることでアルゴリズムにあまり時間がかからないと仮定しましょう。
フェーズ 1 - ボックスを拡張して、各ラインからの交点を 1 つ含めます。
結果のボックスを B[0] と呼びます。
フェーズ 2 - 線がボックスの外側に交差するかどうかを検出します。
重要な観察事項は次のとおりです。ボックス内で交差する 2 本の線 A と B の場合、ボックスを時計回りに歩くと、線が交互になっていることに遭遇します。たとえば、ABA B。 A. もちろん線がボックスの境界で交差したり、平行になったりする可能性はありますが、それは主なアルゴリズムを説明した後に詳細として扱います。
グループ ラインが境界上に共通の入口点または出口点を持っている場合、入口シーケンスと出口シーケンスが明確に定義されていないため、これは完全ではありません。共通の入口点または出口点を持つライン L の各グループについて、L を注文するために少し大きめのボックスを使用します。
このアルゴリズムはすべての交差を出力するわけではありませんが、ボックスにすべての交差が含まれていることを保証します (期待しています)。
O(n log n) 時間で? わお。これが可能だとは思いもしませんでした。
私はまだここで他の答えを見つけていないので、ここに 1 つのアイデアがあります。あなたはそれをあなたが望むものにすることができます。
アイデア: まず、方位または勾配でラインを並べ替えます。他の条件が同じであれば、ほぼ平行な線は離れた点で交差する可能性が高いように見えます。そして、もちろん、あなたが興味を持っているのはその辺境の点です。
凸包のアイデアは正しいように聞こえますが、接線または延長線が関心領域から遠く離れて交差するほぼ平行な側面が包体にある可能性があることを考慮してください。全体として、それは主要なプログラミングの仕事のように思えます。幸運を。