First, defineData structure (based onconventions consistent with the Wikipedia article) the following struct
s (in C) to represent the different elements of a DCEL data structure:
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 */
};
Algorithm
- For each endpoint, create a vertex.
- For each input segment, create two half-edges, and assign their tail vertices and twins.
- For each endpoint, sort the half-edgeshalf-edges whose tail vertex is that endpoint in clockwise order.
- For every pair of half-edgeshalf-edges
e1, e2
in clockwise order, assigne1->twin->next = e2
ande2->prev = e1->twin
.
- Pick one of the half-edgeshalf-edges and assign it as the representative for the endpoint. (Degenerate case: if there's only one half-edgehalf-edge
e
in the sorted list,set e->twin->next = e
ande->prev = e->twin
). The next pointers are a permutation on half-edgeshalf-edges.
- For every cycle, allocate and assign a face structure.