给定一组线段,如何构造双向连接的边列表?


10

对于嵌入在平面中的给定平面图,由一组线段,每个线段均由其端点。为平面细分构造DCEL数据结构,描述算法,证明其正确性并显示复杂性。G(V,E)E={e1,...,em}ei{Li,Ri}

根据对DCEL数据结构的描述,DCEL的不同对象(即顶点,边和面)之间存在许多连接。因此,DCEL似乎很难构建和维护。

您知道可用于构造DCEL数据结构的任何有效算法吗?

Answers:


8

数据结构(与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 */
};

算法

  1. 为每个端点创建一个顶点

  2. 对于每个输入线段,创建两个半边,然后分配其尾部顶点和双胞胎。

  3. 对于每个端点,按顺时针顺序排序其尾顶点为该端点的半边。

  4. 对于e1, e2顺时针方向的每对半边,分配e1->twin->next = e2e2->prev = e1->twin

  5. 选择其中一个半边,并将其指定为端点的代表。(退化情况:如果只有一个半边缘e的排序列表,set e->twin->next = ee->prev = e->twin)。下一个指针是半边的排列。

  6. 对于每个循环,分配并分配一个结构。


2
基本上是一堆粗糙的簿记。这可能就是为什么教科书作者不愿赘述的原因。
pshufb 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.