ギバとシュトルフィの「エッジ代数」形式主義は少し不必要だと思います。
本当に必要なのは、主グラフと二重グラフの違いを覚えておくことです。原グラフの各面には、対応する二重頂点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⃗
- : → eの後、反時計回りに次に尾(→ e)を離れるダーツ。tailNext(e⃗ )tail(e⃗ )e⃗
- :として「同じ」ダーツ → Eが、と左(→ E)と右(→ E)スワップ。flip(e⃗ )e⃗ left(e⃗ )right(e⃗ )
- : → eにその中間点を中心に反時計回りに4分の1回転させることで得られるデュアルダーツ。rotate(e⃗ )e⃗
これらの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つの関数を使用して、任意のサーフェスのポリゴンサブディビジョン(方向付け可能かどうか)をエンコードできます。
クワッドエッジデータ構造は、これらのすべての機能へのアクセスを提供するサーフェスグラフの特に便利な表現であり、エッジの挿入、削除、縮小、拡大、反転などの他のいくつかの一定時間操作も可能です。頂点または面の分割またはマージ。ハンドルまたはクロスキャップを追加または削除します。
楽しんで!