スむヌプラむン法によるドロネヌ䞉角圢分割アルゎリズム

良い䞀日

この蚘事では、「盎線を掃く」ずいうアむデアを䜿甚しお平面䞊にドロネヌ䞉角圢分割を䜜成した結果ずしお埗られたアルゎリズムに぀いお詳しく説明したす。 䞉角枬量に関する蚘事を読んだずきに出䌚ったこずのないアむデアがいく぀かありたす。
おそらく誰かがそれらを珍しいず思うでしょう。 私は最善の䌝統ですべおを行い、次のこずをストヌリヌに含めたす䜿甚されるデヌタ構造の説明、アルゎリズムのステップの説明、正確性の蚌明、時間掚定、およびkDツリヌを䜿甚した反埩アルゎリズムずの比范。

問題の定矩ず説明


䞉角枬量


いく぀かのポむントのペアが゚ッゞで接続されおいる堎合、平面䞊のポむントのセットに䞉角圢分割が䞎えられ、結果のグラフの有限面は䞉角圢を圢成し、゚ッゞは亀差せず、グラフぱッゞの数が最倧になるず蚀われおいたす。



ドロヌネ䞉角圢分割


Delaunay䞉角圢分割は、䞉角圢の呚囲に倖接する円の内偎に元のセットの点が存圚しないこずが事実であるような䞉角圢分割です。



泚 同じ円䞊に4぀のポむントがない特定のポむントセットの堎合、ドロネヌ䞉角圢分割は1぀だけです。

ドロヌネ条件


点の集合に䞉角圢分割を䞎えたす。 このサブセットに囲たれた䞉角圢分割が圌のドロネヌ䞉角圢分割である堎合、ポむントの特定のサブセットはドロネヌ条件を満たしおいるず蚀いたす。

ドロヌネ䞉角圢分割の基準


䞉角圢分割で四角圢を圢成するすべおの点でドロネヌ条件が満たされるこずは、この䞉角圢分割がドロネヌ䞉角圢分割であるずいう事実ず同等です。

泚 非凞四角圢の堎合、ドロヌネ条件は垞に満たされ、凞四角圢頂点が同じ円䞊にないの堎合、正確に2぀の䞉角圢分割が可胜ですそのうちの1぀はドロネヌ䞉角圢分割です。



タスクは、䞎えられたポむントのセットに察しおドロネヌ䞉角圢分割を䜜成するこずです。

アルゎリズムの説明


可芖点ず可芖゚ッゞ


点の有限集合集合のすべおの点を含む倚角圢を圢成するようにいく぀かの点を接続する゚ッゞず、ハルの倖偎にある点Aの最小凞包以䞋、MBOを䞎えたす。 平面のポむントがポむントAに接続されおいるセグメントがMBOず亀差しおいない堎合、ポむントはポむントAに察しお可芖ず呌ばれたす。

MBO゚ッゞは、Aの䞡端が芋える堎合、ポむントAで可芖ず呌ばれたす。

次の画像では、赀い点に芋える端が赀でマヌクされおいたす。



泚 Delaunay䞉角圢分割の茪郭は、それが構築されるポむントのMBOです。

泚2 アルゎリズムでは、远加されたポむントAに衚瀺される゚ッゞはチェヌンを圢成したす。぀たり、耇数のMBO゚ッゞが連続しおいたす。

䞉角枬量をメモリに保存する


Skvortsovの本[1]で詳しく説明されおいる暙準的な方法がいく぀かありたす。 アルゎリズムの仕様により、独自のバヌゞョンを提䟛したす。 Delaunay条件の4ゎンをチェックするため、それらの構造を考慮したす。 䞉角圢分割の各四角圢は、共通の゚ッゞを持぀2぀の䞉角圢です。 各゚ッゞには、ちょうど2぀の䞉角圢が隣接しおいたす。 したがっお、䞉角圢分割の各四角圢は、゚ッゞず、隣接する䞉角圢の゚ッゞの反察偎にある2぀の頂点によっお生成されたす。
2぀の䞉角圢ずその隣接関係が゚ッゞず2぀の頂点に沿っお埩元されるため、このような構造すべおの䞉角圢分割を埩元できたす。 したがっお、セットに2぀の頂点を持぀゚ッゞを栌玍し、゚ッゞ頂点の順序付けられたペアに沿っお怜玢を実行するこずが提案されおいたす。



アルゎリズム


スむヌプラむンのアむデアは、すべおのポむントが䞀方向に゜ヌトされ、順番に凊理されるこずです。

  1. すべおのポむントを盎線に沿っお䞊べ替えたす簡単にするため、座暙で x
  2. 最初の3点に䞉角圢を䜜成したす。

    さらに、次の各ポむントに察しお、既に远加されおいるポむントのDelaunay䞉角圢分割、およびそれらのMBOが存圚するずいう䞍倉条件を保存する手順を実行したす。
  3. 可芖゚ッゞずポむント自䜓によっお圢成された䞉角圢を远加したす぀たり、問題のポむントから可芖゚ッゞのすべおの端に゚ッゞを远加したす。
  4. 可芖゚ッゞによっお生成されたすべおの四角圢をドロヌネ条件で確認したす。 どこかで条件が満たされない堎合、四角圢の䞉角圢分割を再構築し2぀しかないこずを思い出したす、珟圚の四角圢の゚ッゞによっお生成された四角圢のチェックを再垰的に実行したすドロヌネ条件に違反した埌のみ。

泚 再垰的開始時のステップ4では、この反埩で考慮されるポむントから来る゚ッゞによっお生成される四角圢をチェックできたせん垞に4぀のうち2぀がありたす。 ほずんどの堎合、凞ではないため、蚌明は玔粋に幟䜕孊的であるため、読者に任せたす。 さらに、リビルドごずに2回だけ再垰的な開始が実行されるず想定しおいたす。

ドロヌネ状態の怜蚌


ドロヌネ条件の四角圢をテストする方法は、同じ本[1]に蚘茉されおいたす。 そこから䞉角関数を持぀メ゜ッドを遞択するず、䞍正確な実装でサむンの負の倀が取埗される可胜性があり、モゞュロを取るのが理にかなっおいたす。

目に芋える゚ッゞを怜玢する


目に芋える゚ッゞを効果的に芋぀ける方法を理解するこずは残っおいたす。 以前に远加されたポむントSは最倧の座暙を持぀ため、珟圚の反埩ではMBOにあるこずに泚意しおください。 x、珟圚のポむントでも衚瀺されたす。 次に、可芖゚ッゞの端が可芖ポむントの連続チェヌンを圢成するこずに泚意しお、MBOに沿っお䞡方向にポむントSから移動し、可芖の間に゚ッゞを収集したす゚ッゞの可芖性はベクトル積を䜿甚しおチェックされたす。 したがっお、MBOを二重接続リストずしお保存するず䟿利です。各反埩で、目に芋える゚ッゞを削陀し、問題のポむントから2぀の新しい゚ッゞを远加したす。



アルゎリズムの芖芚化


2぀の赀い点-远加および前。 各瞬間の赀い゚ッゞは、ステップ4からの再垰スタックを構成したす。



アルゎリズムの正確さ


アルゎリズムの正しさを蚌明するには、ステップ3および4で䞍倉量の保存を蚌明するだけで十分です。

ステップ3


ステップ3の埌、明らかに、珟圚のポむントセットの䞉角圢分割が埗られたす。

ステップ4


ステップ4のプロセスでは、ドロヌネ条件を満たさないすべおの四角圢が再垰スタックにありたす説明を参照。これは、ステップ4の終わりに、すべおの四角圢がドロヌネ条件を満たしおいるこずを意味したす。぀たり、ドロヌネ䞉角圢分割が実際に構築されたす。 その埌、ステップ4のプロセスがい぀か終了するこずを蚌明する必芁がありたす。 これは、再構築䞭に远加されたすべおの゚ッゞが問題の珟圚の頂点から来るずいう事実に基づいおいたす぀たり、ステップ kしかありたせん k−1そしお、これらの゚ッゞを远加した埌、それらによっお生成された四角圢を考慮しないずいう事実から前のコメントを参照、぀たり、远加するのは1回のみです。

時間の耇雑さ


平均しお、アルゎリズムは均䞀な正芏分垃で非垞にうたく機胜したす結果を以䞋の衚に瀺したす。 その䜜業時間は ONlogN。 最悪の堎合、評䟡が行われたす ON2。



䜜業時間を郚分的に芋お、どれが総時間に最も倧きな圱響を䞎えおいるかを理解したしょう。

方向で䞊べ替え


゜ヌトには、掚定倀を䜿甚したす ONlogN。

目に芋える゚ッゞを怜玢する


たず、可芖゚ッゞの怜玢に費やした合蚈時間が ON。 各反埩で、線圢時間ですべおの可芖゚ッゞずさらに2぀最初の非可芖が芋぀かるこずに泚意しおください。 ステップ3では、MBOに新しい2぀の゚ッゞを远加したす。 したがっお、合蚈で、 2Nrib骚、したがっお、さたざたな目に芋えるrib骚はもはやなくなりたす 2N。 私たちも芋぀けたす 2N芋えない゚ッゞ。 したがっお、合蚈でこれ以䞊はありたせん 4N時間に察応するrib骚 ON。

新しい䞉角圢の構築


ステップ3から䞉角圢が構築され、可芖゚ッゞが既に芋぀かっおいる合蚈時間は明らかに ON。

䞉角枬量の再構築


手順4の凊理は残りたす。 たず、ドロヌネの条件を確認し、満たされおいない堎合は再構築するこずは非垞に費甚のかかるアクションですただし、 O1 Delaunay条件を確認する堎合のみ、玄28の算術挔算を実行できたす。 このステップでの再構築の平均回数を芋おみたしょう。 䞀郚の分垃の実際の結果を以䞋に瀺したす。 圌らにずっお、再配眮の平均数は察数速床で増加するず本圓に蚀いたいのですが、これを仮定のたたにしおおきたしょう。



ここで、ポむントごずの再配眮の平均数は、䞊べ替えが実行される方向によっお倧きく異なる可胜性があるこずにも泚意しおください。 したがっお、アスペクト比が1000001の長い䜎い長方圢に均等に分散された100䞇の堎合、この数は1.2から24に倉化したすこれらの倀は、デヌタをそれぞれ氎平および垂盎に゜ヌトするずきに達成されたす。 したがっお、任意の方法で゜ヌト方向を遞択するこの䟋では、平均で玄2回の再構築が行われたか、デヌタが事前にわかっおいる堎合は手動で遞択するこずに泚意しおください。

したがっお、プログラムが通垞ステップ4に芁する時間。 実行速床が速い堎合、゜ヌトの高速化を怜蚎するのは理にかなっおいたす。

最悪の堎合


最悪の堎合 k番目の反埩が発生したす k−1ステップ4の再垰呌び出し、぀たりすべおのiを合蚈するず、最悪の堎合の挞近的な動䜜が埗られたす ON2。 次の図は、プログラムが長時間動䜜できる矎しい䟋を瀺しおいたす10,000ポむントの入力で新しいポむントを远加するず、平均で1100が再構築されたす。



kDツリヌを䜿甚しおDelaunay䞉角圢分割を構築するための反埩アルゎリズムずの比范


反埩アルゎリズムの説明


䞊蚘のアルゎリズムに぀いお簡単に説明したす。 次のポむントが到着するず、kDツリヌを䜿甚したす分からない堎合は、どこかで読むこずをお勧めしたす。すでに非垞に近い䞉角圢を芋぀けたす。 次に、深さをバむパスしお、ポむント自䜓が入る䞉角圢を探したす。 芋぀かった䞉角圢の頂点たで゚ッゞを拡匵し、新しい四角圢のアルゎリズムから実際にステップ4を実行したす。 ポむントは䞉角圢分割の倖偎にある可胜性があるため、簡略化のために、すべおのポむントを倧きな䞉角圢で芆うこず事前に構築するこずを提案したす。これにより問題が解決したす。

アルゎリズムの類䌌性


実際、方向によっお゜ヌトされた順序でポむントが远加される堎合、再配眮の数が少ないこずを陀いお、アルゎリズムは実際には反埩ず同じように機胜したす。 次のアニメヌションはこれを非垞によく瀺しおいたす。 その䞊で、ポむントは右から巊に远加され、それらはすべお倧きな䞉角圢で芆われ、その埌削陀されたす。



アルゎリズムの違い


反埩アルゎリズムでは、ポむントの定䜍目的の䞉角圢の怜玢は平均しお OlogN、䞊蚘の分垃では、ポむントの䟛絊の任意の順序の条件䞋で、平均しお、3぀の再配眮が発生したす[1]を参照。 したがっお、スむヌプラむンは、ロヌカリれヌションで反埩アルゎリズムの時間を獲埗したすが、再構築ではそれを倱いたすこれは非垞に難しいこずです。 さらに、反埩アルゎリズムはオンラむンでも機胜したすが、これもその特城的な機胜です。

おわりに


ここでは、アルゎリズムの操䜜から生じるいく぀かの興味深い䞉角圢分割を瀺したす。

矎しい暡様




正芏分垃、1000ポむント




均䞀な分垃、1000ポむント




ロシアのすべおの郜垂の堎所に基づいた䞉角枬量





ここで、このアルゎリズムの私のコヌドの䟋を芋るこずができたす
github.com/Vemmy124/Delaunay-Triangulation-Algorithm

ご枅聎ありがずうございたした

文孊


[1] Skvortsov A.V. ドロヌネの䞉角圢分割ずその応甚。 -トムスク出版瀟トム。 倧孊、2002幎-128秒 ISBN 5-7511-1501-5

Source: https://habr.com/ru/post/J445048/


All Articles