我正在实现一种算法,我需要在其中操作网格,快速添加和删除边缘,并在CCW或CW顺序的顶点附近快速迭代。
翼边结构用于我正在使用的算法的描述中,但是我找不到关于如何在该数据结构上执行这些操作的任何简明描述。
答案 0 :(得分:9)
我在大学学到了这一点,但那是不久前的事。
为了回答这个问题,我在网上搜索了任何好的文档,发现没有什么是好的,但是我们可以在这里查看CCW和CW命令以及插入/删除的快速示例。 看看这张表和图形: 从这个页面:
http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/model/winged-e.html
该表仅提供一条边a
的条目,在实际表格中,每条边都有此行。你可以看到你得到:
但是关键点是:它给出了它们相对于边缘的方向,在这种情况下是X->Y
,当它是右移的时候(e->a->c)
因此,对于通过图表的CW顺序,这很容易理解:边缘a
左边有右后继c
,然后你查看边缘{{1}的行}。
好的,这个表很容易阅读CW顺序遍历;对于CCW你必须思考“当我向后走这条边时,我从哪个边缘来”。通过在这种情况下使用左移位前导c
并以相同方式继续边b
的行条目,有效地获得CCW顺序的下一个边缘。
现在插入和删除:显然你不能删除边缘并认为图形仍然只包含三角形;在删除过程中,您必须加入两个顶点,例如图形中的b
和X
。要做到这一点,首先必须确保在引用边Y
的任何地方 - 我们必须修复该引用。
那么a
可以在何处被提及?只有在边a
(所有其他边缘都太远,无法知道b,c,d and e
)加上vertex-> edge-table,如果有的话(但我们只考虑其中的edge-table)例子)。
作为我们如何修复边缘的示例,我们来看看a
。与c
一样,a
有左前和右前(和4个边),其中一个是c
?我们无法在不进行检查的情况下知道,因为a
的表条目可以在其开始节点或结束节点中具有节点c
。所以我们必须检查它是哪一个,让我们假设我们发现Y
在其起始节点中有Y,然后我们必须检查c
是否是a
右前任(它是我们通过查看c's
条目并将其与c's
进行比较,以及a
对后继者来查找。 “接班人??”你可能会问?是的,因为记住两个“左移” - 列相对于向后移动边缘。所以,现在我们发现c's
是a
正确的前任,我们可以通过插入c's
右前任来修复该引用。继续使用其他3个边缘,完成边缘表格。修复额外的a's
当然是微不足道的,只需查看X和Y的条目并删除那里的Node->Vertices
。
添加边缘基本与其他4个边缘的修复相反,但稍微扭曲。让我们调用我们要分割的节点a
(它将分为Z
和X
)。您必须注意将其拆分为正确的方向,因为您可以将Y
和d
合并到一个节点或e
和e
中(如果是新的话) edge是水平的而不是图形中的垂直c
!首先必须找出即将成为a
的哪两条边以及X
新边缘的两条边之间:您只需选择哪一条边应位于一个节点上在另一个节点上:在此示例图形中:在一个节点上选择您想要Y
,b
和它们之间的北边的2个边缘,然后其他边缘位于其他节点将成为c
。然后通过向量减法找到新边X
必须在b和c之间,而不是在c和北边的2个边之一之间。向量减法是新a
的所需位置减去X
的所需位置。