Wie erstelle ich eine doppelt verbundene Kantenliste bei einer Reihe von Liniensegmenten?

10

Für einen gegebenen planaren Graphen in die Ebene eingebettet ist, definiert durch eine Menge von Liniensegmenten E = { e 1 , . . . , e m } wird jedes Segment e i durch seine Endpunkte { L i , R i } dargestellt . Erstellen Sie eine DCEL-Datenstruktur für die planare Unterteilung, beschreiben Sie einen Algorithmus, beweisen Sie seine Richtigkeit und zeigen Sie die Komplexität.G(V.,E.)E.={e1,...,em}}eich{L.ich,R.ich}}

Gemäß dieser Beschreibung der DCEL-Datenstruktur gibt es viele Verbindungen zwischen verschiedenen Objekten (dh Eckpunkten, Kanten und Flächen) der DCEL. Ein DCEL scheint also schwierig zu bauen und zu warten.

Kennen Sie einen effizienten Algorithmus, mit dem eine DCEL-Datenstruktur erstellt werden kann?

com
quelle

Antworten:

8

Datenstruktur (Konventionen im Einklang mit dem Wikipedia-Artikel ):

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

Algorithmus

  1. Erstellen Sie für jeden Endpunkt einen Scheitelpunkt .

  2. Erstellen Sie für jedes Eingabesegment zwei Halbkanten und weisen Sie deren Endscheitelpunkte und Zwillinge zu.

  3. Sortieren Sie für jeden Endpunkt die Halbkanten, deren Endpunkt dieser Endpunkt ist, im Uhrzeigersinn.

  4. Weisen Sie für jedes Paar von Halbkanten e1, e2im Uhrzeigersinn e1->twin->next = e2und zu e2->prev = e1->twin.

  5. Wählen Sie eine der Halbkanten aus und weisen Sie sie als Repräsentanten für den Endpunkt zu. (Entarteter Fall: Wenn edie sortierte Liste nur eine halbe Kante enthält , set e->twin->next = eund e->prev = e->twin). Die nächsten Zeiger sind eine Permutation an Halbkanten.

  6. Ordnen Sie für jeden Zyklus eine Gesichtsstruktur zu und weisen Sie sie zu .

pshufb
quelle
2
Im Grunde genommen ein Haufen knorriger Buchhaltung. Dies ist wahrscheinlich der Grund, warum Lehrbuchautoren nur ungern ins Detail gehen.
Pshufb