Comment puis-je construire une liste de bords doublement connectés en fonction d'un ensemble de segments de ligne?

10

Pour un graphe planaire donné noyé dans le plan, défini par un ensemble de segments de droite , chaque segment est représenté par ses extrémités . Construisez une structure de données DCEL pour la subdivision planaire, décrivez un algorithme, prouvez son exactitude et montrez la complexité.g(V,E)E={e1,...,em}eje{Lje,Rje}

Selon cette description de la structure de données DCEL , il existe de nombreuses connexions entre différents objets (c.-à-d. Sommets, arêtes et faces) du DCEL. Ainsi, un DCEL semble être difficile à construire et à entretenir.

Connaissez-vous un algorithme efficace pouvant être utilisé pour construire une structure de données DCEL?

com
la source

Réponses:

8

Structure des données (conventions cohérentes avec l'article Wikipedia ):

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

Algorithme

  1. Pour chaque point d'extrémité, créez un sommet .

  2. Pour chaque segment d'entrée, créez deux demi-bords et affectez leurs sommets de queue et leurs jumeaux.

  3. Pour chaque point d'extrémité, triez les demi-bords dont le sommet de queue est ce point d'extrémité dans le sens des aiguilles d'une montre.

  4. Pour chaque paire de demi-bords e1, e2dans le sens horaire, attribuez e1->twin->next = e2et e2->prev = e1->twin.

  5. Sélectionnez l'un des demi-bords et affectez-le en tant que représentant du point de terminaison. (Cas dégénéré: s'il n'y a qu'un demi-bord edans la liste triée, set e->twin->next = eet e->prev = e->twin). Les pointeurs suivants sont une permutation sur les demi-bords.

  6. Pour chaque cycle, allouez et affectez une structure de visage .

pshufb
la source
2
Fondamentalement, un tas de comptabilité noueux. C'est probablement pourquoi les auteurs de manuels hésitent à entrer dans les détails.
pshufb