Come faccio a costruire un elenco di bordi doppiamente connesso dato un insieme di segmenti di linea?


10

Per un dato grafo planare incorporato nel piano, definita da una serie di segmenti di linea E = { e 1 , . . . , e m } , ogni segmento e i è rappresentato dai suoi punti finali { L i , R i } . Costruisci una struttura di dati DCEL per la suddivisione planare, descrivi un algoritmo, dimostra la sua correttezza e mostra la complessità.sol(V,E)E={e1,...,em}eio{Lio,Rio}

Secondo questa descrizione della struttura di dati DCEL , ci sono molte connessioni tra oggetti diversi (es. Vertici, bordi e facce) del DCEL. Quindi, un DCEL sembra essere difficile da costruire e mantenere.

Conoscete qualche algoritmo efficiente che può essere utilizzato per costruire una struttura di dati DCEL?

Risposte:


8

Struttura dei dati (convenzioni coerenti con l'articolo di 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 */
};

Algoritmo

  1. Per ciascun endpoint, creare un vertice .

  2. Per ogni segmento di input, crea due semigordi e assegna i vertici e i gemelli della coda.

  3. Per ciascun endpoint, ordinare i semigiunti il ​​cui vertice di coda è quell'endpoint in senso orario.

  4. Per ogni coppia di semigiunti e1, e2in senso orario, assegnare e1->twin->next = e2e e2->prev = e1->twin.

  5. Seleziona uno dei mezzitoni e assegnalo come rappresentante per l'endpoint. (Caso degenerato: se enella lista ordinata è presente solo un mezzo margine set e->twin->next = ee e->prev = e->twin). I puntatori successivi sono una permutazione sui mezzotondi.

  6. Per ogni ciclo, allocare e assegnare una struttura facciale .


2
Fondamentalmente un mucchio di contabilità nodosa. Questo è probabilmente il motivo per cui gli autori di libri di testo sono riluttanti ad entrare nei dettagli.
pshufb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.