对于嵌入在平面中的给定平面图,由一组线段,每个线段均由其端点。为平面细分构造DCEL数据结构,描述算法,证明其正确性并显示复杂性。
根据对DCEL数据结构的描述,DCEL的不同对象(即顶点,边和面)之间存在许多连接。因此,DCEL似乎很难构建和维护。
您知道可用于构造DCEL数据结构的任何有效算法吗?
对于嵌入在平面中的给定平面图,由一组线段,每个线段均由其端点。为平面细分构造DCEL数据结构,描述算法,证明其正确性并显示复杂性。
根据对DCEL数据结构的描述,DCEL的不同对象(即顶点,边和面)之间存在许多连接。因此,DCEL似乎很难构建和维护。
您知道可用于构造DCEL数据结构的任何有效算法吗?
Answers:
数据结构(与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 */
};
算法
为每个端点创建一个顶点。
对于每个输入线段,创建两个半边,然后分配其尾部顶点和双胞胎。
对于每个端点,按顺时针顺序排序其尾顶点为该端点的半边。
对于
e1, e2
顺时针方向的每对半边,分配e1->twin->next = e2
和e2->prev = e1->twin
。选择其中一个半边,并将其指定为端点的代表。(退化情况:如果只有一个半边缘
e
的排序列表,set e->twin->next = e
和e->prev = e->twin
)。下一个指针是半边的排列。对于每个循环,分配并分配一个面结构。