どの三角形ポイントが含まれているかを見つける


16

重複しない三角形で構成される2Dメッシュと、点のセット。各ポイントがどの三角形にあるかを判断する最良の方法は何ですか? { P I } M iは= 1NのK = 1 T K{Tk}k=1N{p}=1Mk=1NTK

たとえば、次の画像には、、があるため、リストを返す関数が。P 2T 4 P 3T 2 F F P 1P 2P 3= [ 2 4 2 ]p1T2p2T4p3T2ffp1p2p3=[242]

ここに画像の説明を入力してください

Matlabには、Delaunayメッシュに必要なことを行う関数pointlocationがありますが、一般的なメッシュでは失敗します。

私の最初の(愚かな)考えは、すべてのノード、すべての三角形をループして、どの三角形が入っているかを見つけることです。しかし、これは非常に非効率的です。取るの作品を。ppONM

私の次の考えは、すべての点について、最近傍検索を介して最も近いメッシュノードを見つけ、その最も近いノードに接続された三角形を調べることです。この場合、作業はになります。ここではメッシュ内のノードに接続された三角形の最大数です。このアプローチには、解決できるが厄介な問題がいくつかあり、pOaMlogNa

  • 効率的な最近傍検索を実装する(またはそれを含むライブラリを見つける)必要がありますが、これは簡単な作業ではありません。
  • 各ノードに接続されている三角形のリストを保存する必要がありますが、私のコードは現在設定されていません-現在、ノード座標のリストと要素のリストがあります。

全体としてはエレガントではないように思えますが、もっと良い方法があるはずです。これは多くの問題であるに違いないので、理論上または利用可能なライブラリの観点から、ノードがどの三角形にあるのかを見つけるための最善の方法を誰かがお勧めできるかどうか疑問に思っていました。

ありがとう!

回答:


16

通常のランダム化されたエッジホッピング方法が機能します。基本的には、メッシュの三角形から始めて、ターゲットポイントが反対側にあるエッジを決定します。つまり、線まで延長したときに、三角形の内部からポイントを分離するエッジを決定します。2つの可能性がある場合、1つをランダムに選択し、その共有エッジに隣接する三角形を考慮して、繰り返します。ランダム化により、このメソッドはドロネー三角形分割の確率1で収束するはずであり、任意の三角形分割では機能しない理由は考えられません。

編集:エッジホッピングはであり、単一のポイントに対して妥当な定数である必要があるため、ポイントに対してはになることを追加する必要があり。ただし、ポイントをローカリティで並べ替える場合(ヒルベルト曲線の順序を最初に使用するなど)、以前のクエリの三角形で各新しいクエリを初期化して、ランタイムをさらに短縮することができます(CS理論家ではないので、 tは、ビッグOが何になるかを教えてくれます)。O M log N MOログNOMログNM

Edit2:終了することが保証されているこのような「ウォーキング」スキームを説明するこのPDFを見つけ、より単純なアプローチをレビューします。

クアッドツリーを使用する別の方法は、三角測量階層を使用することです。Olivier Devillersを参照してください。増分ランダム化Delaunay三角形分割の改善。Procで。14周年。ACMシンポジウム。計算。Geom。、ページ106-115、1998。これは、ドロネー三角形分割に最適ですが、ドロネー以外にも使用できます。

基本的に、ポイントロケーションを高速化するために行うことはすべて、補助データ構造の構築を必要とします。四分木または他の空間的サブディビジョンの場合、サブディビジョンツリーを構築する必要があります。エッジホッピングの場合、トポロジ構造に隣接する三角形を構築する必要があります。三角形分割階層では、より粗い三角形分割のツリーを構築する必要もあります。


ビクター-エッジホッピングアプローチを暗示するオープンソースコードを知っていますか?ITは、私の場合、非常に優れたソリューションであると思われます。(traingualrメッシュグリッドの現在のフィールドによって駆動される粒子追跡モデル)
クリスバーカー

このためのコードがあり、それをあなたに送ることができます。C / C ++にあります。まだクリーンアップしてGithubに投稿する時間がありません。私はこれを人生で少なくとも2回、1回はハーフエッジデータ構造で、もう1回はクアッドエッジで書く必要がありましたが、それらが利用できず、トポロジ構造を自分で構築する必要がある場合は簡単に使用できます。連絡先情報を見つけることができる私のウェブサイトの私のプロフィールページを見てください。これについてはさらにオフラインで議論できます。
ビクター

ヒルベルト曲線の順序付けとランダム化された三角形のウォークを使用して、これをmatlabで実装し終えました。それは研究コードです:最適化も文書化もされていませんが、それでもかなり高速です-興味があればコードを提供できます。
ニック・アルジェ

2
について: "" "エッジホッピングはO(logN)である必要があります" ""わかりません。たとえば、大きな長い三角形のストリップの病理学的な場合(三角形の幅が広いのみの狭いチャネルなど)、最悪の場合、ある三角形から次の三角形まで最後までホップする必要があります。平均的なケースでは、途中です。したがって、三角形の数を2倍にすると、O(N)になります。三角形の正方形のような配置の通常の場合、O(sqrt(N))が期待されます。それとも何か不足していますか?-Chris
クリス・バーカー

@Chris-scicompへようこそ!scicompのハウスキーピングの一環として、私はあなたの答えとその後の会話を、Victorの答えに対するコメントとして移行しました。サイトへのご参加をお待ちしております。
アロンアーマディア

8

あなたの解決策が実際に正しいとは思いません。これらのノードがある状況を考慮してください。

  • A:(-3、1)
  • B:(0、2)
  • C:(3、1)
  • D:(0、-5)

三角形ABCとACDがあります。これで、Bは原点に最も近い点になりますが、原点は三角形ACDにあり、Bを含みません。

ONM

三角形自体を含むクアッドツリーを構築するオプションを検討します。つまり、各ノード(境界ボックスに対応)に格納する4次ツリーがあります。

  • ボックスが分割される座標、または4つのサブツリーの境界ボックス。
  • サブツリーへのポインター。
  • この長方形の境界ボックス内に完全に収まるが、4つのサブツリーのいずれにも完全には収まらない三角形のセット。言い換えると、四分木の2つの細分割線セグメントのいずれかと交差する三角形。

nnログnONM


うーん、あなたは正しい。一方、三角測量がドローネであった場合、最も近い隣人が機能すると思います。私がやろうとしていることにはあまりにも制限がありますが、ドロネーの場合、デュアルボロノイ図を考えてください-ボロノイセルはノードに最も近い点のセットであり、ドロネー三角形のエッジはすべてボロノイのエッジを満たしますセルは直角であるため、すべてのポイントは最も近いノードに接続された三角形内になければなりません。これがmatlabのpointLocation関数が内部でどのように機能するのか疑問に思います。
ニック・アルジェ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.