一連の線分が与えられたときに、二重に接続されたエッジリストを作成するにはどうすればよいですか


10

一連の線分によって定義される、平面に埋め込まれた特定の平面グラフ場合、各セグメントはその端点表されます。平面サブディビジョンのDCELデータ構造を構築し、アルゴリズムを記述し、それが正確であることを証明し、複雑さを示します。G(V,E)E={e1,...,em}ei{Li,Ri}

DCELデータ構造のこの説明によれば、DCELの異なるオブジェクト(つまり、頂点、エッジ、面)の間には多くの接続があります。したがって、DCELの構築と保守は難しいようです。

DCELデータ構造を構築するために使用できる効率的なアルゴリズムを知っていますか?

回答:


8

データ構造(ウィキペディアの記事と一致する規約):

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 */
};

アルゴリズム

  1. エンドポイントごとに、頂点を作成します。

  2. 入力セグメントごとに、2つのハーフエッジを作成し、それらのテール頂点とツインを割り当てます。

  3. 各エンドポイントについて、テール頂点がそのエンドポイントであるハーフエッジを時計回りにソートします。

  4. ハーフエッジのすべてのペアのためにe1, e2、時計回り順に、割り当てe1->twin->next = e2e2->prev = e1->twin

  5. ハーフエッジの1つを選択し、それをエンドポイントの代表として割り当てます。(縮退ケース:一つだけのハーフエッジがあるかどうeソートされたリストでは、set e->twin->next = ee->prev = e->twin)。次のポインタは、ハーフエッジの順列です。

  6. サイクルごとに、構造を割り当てて割り当てます。


2
基本的に危険な簿記の束。これがおそらく、教科書の著者が詳細に進むのをためらう理由です。
pshufb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.