一連の線分によって定義される、平面に埋め込まれた特定の平面グラフ場合、各セグメントはその端点表されます。平面サブディビジョンのDCELデータ構造を構築し、アルゴリズムを記述し、それが正確であることを証明し、複雑さを示します。
DCELデータ構造のこの説明によれば、DCELの異なるオブジェクト(つまり、頂点、エッジ、面)の間には多くの接続があります。したがって、DCELの構築と保守は難しいようです。
DCELデータ構造を構築するために使用できる効率的なアルゴリズムを知っていますか?
一連の線分によって定義される、平面に埋め込まれた特定の平面グラフ場合、各セグメントはその端点表されます。平面サブディビジョンのDCELデータ構造を構築し、アルゴリズムを記述し、それが正確であることを証明し、複雑さを示します。
DCELデータ構造のこの説明によれば、DCELの異なるオブジェクト(つまり、頂点、エッジ、面)の間には多くの接続があります。したがって、DCELの構築と保守は難しいようです。
DCELデータ構造を構築するために使用できる効率的なアルゴリズムを知っていますか?
回答:
データ構造(ウィキペディアの記事と一致する規約):
struct half_edge;
struct vertex {
struct half_edge *rep; /* rep->tail == this */
};
struct face {
struct half_edge *rep; /* rep->left == this */
};
struct half_edge {
struct half_edge *prev; /* prev->next == this */
struct half_edge *next; /* next->prev == this */
struct half_edge *twin; /* twin->twin == this */
struct vertex *tail; /* twin->next->tail == tail &&
prev->twin->tail == tail */
struct face *left; /* prev->left == left && next->left == left */
};
アルゴリズム
エンドポイントごとに、頂点を作成します。
入力セグメントごとに、2つのハーフエッジを作成し、それらのテール頂点とツインを割り当てます。
各エンドポイントについて、テール頂点がそのエンドポイントであるハーフエッジを時計回りにソートします。
ハーフエッジのすべてのペアのために
e1, e2
、時計回り順に、割り当てe1->twin->next = e2
とe2->prev = e1->twin
。ハーフエッジの1つを選択し、それをエンドポイントの代表として割り当てます。(縮退ケース:一つだけのハーフエッジがあるかどう
e
ソートされたリストでは、set e->twin->next = e
とe->prev = e->twin
)。次のポインタは、ハーフエッジの順列です。サイクルごとに、面構造を割り当てて割り当てます。