私はDelaunay triangulation(宿題ではない)を学習していました。次の問題について考えました。平面上に点群S
(基数がn
)と三角形T
(基数がn-2
である必要があります) - 三角形がT
に設定されているかどうかを判断する方法は、Delaunay三角形分割DT(S)
ですか?点集合三角形分割が三角形分割であるかどうかをチェック
最初の問題は、Delaunayの三角測量がユニークではないため、再度設定した点のために再構築し、設定された三角形と比較することで答えが得られないことです。さらに、最適なDelaunay三角形分割アルゴリズムは実装するのが難しいです(しかし、CGALのようなライブラリを使っても問題ありませんでした)。
三角形が三角形分割(必ずしもDelaunayではない)であるかどうかを確認する方法を知っているとします。次に、Delanuay三角測量の定義を使用する必要があります。三角形の中のすべての三角形t
に対して、の点は、厳密には、円の内側のt
にありません。これは、以下の方法につながります。
- 些細なアプローチ。
T
を反復し、円周を計算して、S
を繰り返して、点が円周の内側にあるかどうかを確認します。しかし、これには時間がかかりますが、これはあまり最適ではありません。 - エンチャンテッドアプローチ。再び、
T
を繰り返して、円周を計算します。円の内側に点s
がある場合は、円周の中心までの距離が半径よりも小さいことを意味します。S
以上の最近接検索構造を使用して、アルゴリズムを高速化します。例えば、単純なkd-tree構造は、平均でO(n log n)
アルゴリズム、そして最悪の場合にはO(n sqrt(n))
アルゴリズムにつながります。 - 誰かがもっと簡単なアイデアを持っていますか?
次に、T
が三角測量であるかどうかをチェックする問題に戻りましょう。 S
の等価と三角形の頂点のセットのような単純な前提条件は、O(n log n)
より速く実行することはできません。残っているもの - T
の2つの三角形がすべて共通の面に交差するか、まったく交差しないかを確認する。
- ここでも、交差点をチェックし、
T
オーバーT
と再びを反復処理することによってこれを行うことができますが、これはO(n^2)
アルゴリズムです。 - 三角形
t1
とt2
が何を意味するのかを考えてみましょう。それらのエッジが交差する場合、または1つの三角形が完全に別の三角形にある場合、交差します。すべての辺を交差する問題は、Bentley-Ottmann algorithmを使用してO(n log n)
の時間で解くことができます(最悪の場合はO((n + k) log n)
です。ここで、k
が最初の交差点を見つけた時点でアルゴリズムを停止できます)。また、ある三角形が完全に別の三角形を含む場合は認識しませんでしたが、Bentley-Ottmannアルゴリズムを修正して、セグメントの代わりに掃引線を横切る三角形を維持することができると信じており、私たちはO(n log n)
アルゴリズムを生成します。しかし、実装するのは本当に複雑です。 - 私は反復的なアルゴリズムについて考えました。交差していない(または辺でしか交差しない)三角形の構造を維持しようとします(kd-treeと非常に似ているはずです)。次に、次の三角形
t
を追加しようとします。t
の頂点のいずれかがすでに三角形の1つにあるかどうかを最初に確認してから、交差点を取得します。それ以外の場合は、t
を構造体に追加します。しかし、O(log n)
またはO(sqrt(n))
の検索に時間を費やしてクエリを追加する必要がある場合は、この構造体の高さのバランスをとる必要があります。これはkd木でも難しいです。
誰もがこの問題の簡単な解決法を知っていますか?
三角測量であると仮定すると、すべてのエッジの合法性をテストするために反復することができますか?別のアイデア - デュアルスペースの問題を考えましたか?サブディビジョンがボロノイ図であるかどうかわかりますか? – rrufai
一般的な位置にあるポイントの場合、DTは実際には一意です。そのような三角測量のための角度ベクトルもユニークです!私の指摘は、これがアプローチを排除する理由ではないということです。 – rrufai