クワッドエッジデータ構造(Delaunay / Voronoi)


18

計算幾何学者または代数論者に対する2つの質問:

私は計算幾何学に飛び込み始めたばかりで、私はそれを愛しています=)

Delaunay三角形分割アルゴリズムを実装するために、「一般的な下位区分の操作とボロノイ図の計算のためのプリミティブ」と呼ばれるGuibasとStolfiの有名な記事を読みたいと思います。私はすべての理論的なものをスキップし、時間を節約するためにクワッドエッジデータ構造の説明を読むだけです。ただし、構造が広く使用されている場合、または単に美しいからといって、記事のすべての数学を理解することは価値があると思います。

数学は私にとっては少し濃いです。私はトポロジーについて完全に無知ではありませんが、それらのエッジ代数の記述には、私が持っていない抽象代数の知識が必要です。

私の2つの質問は次のとおりです。Delaunay/ Voronoiの計算以外に、クワッドエッジ構造の他のアプリケーションはありますか。非常に強力なツールのようです。

2番目の質問。抽象代数とは何ですか?抽象代数の紹介への参照を与えていただければ幸いです。それらのエッジ代数のセクションを理解するのに十分です。

ありがとうございました!


3
ギャップを埋めるために:抽象代数は、特定のルールを尊重する要素のセットの研究です。ご想像のとおり、これらのセットが満たすルールは、閉包、恒等要素、一意の逆数の存在などのプロパティであり、また、可換性、結合性などが進むと、必ずしも実数のように振る舞うとは限らないセットの代数の研究です(良い例は順列です)。
— ロススナイダー


私の2番目の質問は、少し質問が間違っていたと思います。いくつかのグループ理論を知っています。私はリングとフィールドが何であるかを知っています。記事では、抽象代数を定義しているだけです。 「エッジ代数は、E1-E5およびF1-F5のプロパティを満たす抽象代数(E、E *、Onext、Rot、Flip)です」
— -bigmonachus

[...]そして、それが何を意味するのか分かりません。フィールド上の代数ではありませんか?
— bigmonachus

回答:


32

ギバとシュトルフィの「エッジ代数」形式主義は少し不必要だと思います。

本当に必要なのは、主グラフと二重グラフの違いを覚えておくことです。原グラフの各面には、対応する二重頂点f ∗があります。主グラフの各エッジeには、対応するデュアルエッジe ∗があります。また、原始グラフの各頂点vには、対応する双対面v ∗があります。プライマルエッジは、プライマル頂点と個別のプライマルフェースを接続します。デュアルエッジは、デュアル頂点を接続し、デュアルフェースを分離します。何の二重の二重も元のものです。Guibas and Stolfiの論文の図4を参照してください。ff∗ee∗vv∗

原グラフと双対グラフ

GuibasとStolfiは、各エッジ(プライマリまたはデュアル)を4つの方向付けられた方向のあるエッジの集まりとして考えることを提案しています。簡単にするために、これらのダーツと呼びます。各ダーツ、一方のエンドポイントテール(→ e)から他方のエンドポイントヘッド(→ e)を指し、2つの面を左(→ e)と右(→ e)に局所的に分離します。テール(→ e)を呼び出すエンドポイントの選択は、ダーツのe→tail(e→)head(e→)left(e→)right(e→)tail(e→)方向、およびを呼び出す面の選択は、その方向です。(GuibasとStolfiは、「tail」と「head」の代わりに「Org」と「Dest」を使用しますが、不要な略語は悪であるため、短いラベルを好みます。)left(e→)

ダーツ場合、ギバとシュトルフィは3つの関連ダーツを関連付けます。e→

  1. : → eの後、反時計回りに次に尾(→ e)を離れるダーツ。tailNext(e→)tail(e→)e→
  2. :として「同じ」ダーツ → Eが、と左(→ E)と右(→ E)スワップ。flip(e→)e→left(e→)right(e→)
  3. : → eにその中間点を中心に反時計回りに4分の1回転させることで得られるデュアルダーツ。rotate(e→)e→

tailNext、回転、反転

これらの3つの関数は、次のようなあらゆる種類の素晴らしいアイデンティティを満たします。

  • right(tailNext(e→))=left(e→)
  • right(flip(e→))=left(e→)
  • right(rotate(e→))=head(e→)∗
  • flip(flip(e→))=e→
  • rotate(rotate(rotate(rotate(e→))))=e→
  • tailNext(rotate(tailNext(rotate(e→))))=e→

e Flipe.Flip

さらに、これらの3つの関数が与えられると、次のようないくつかの他の便利な関数を定義できます。

  • reverse(e→)=rotate(flip(rotate(e→)))
  • leftNext(e→)=rotate(tailNext(rotate(rotate(rotate(e→)))))e→left(e→)

最後に、これらの関数を知っていると、サブディビジョンのトポロジに関するすべての情報が得られ、これらの3つの関数を使用して、任意のサーフェスのポリゴンサブディビジョン(方向付け可能かどうか)をエンコードできます。

クワッドエッジデータ構造は、これらのすべての機能へのアクセスを提供するサーフェスグラフの特に便利な表現であり、エッジの挿入、削除、縮小、拡大、反転などの他のいくつかの一定時間操作も可能です。頂点または面の分割またはマージ。ハンドルまたはクロスキャップを追加または削除します。

楽しんで!


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