表示一个空间多边形网格的常用方法是使用一个顶点列表和一个面列表,在面结构中存储属于该面的顶点的指针。这种方式是非常便捷高效的,但是它没有存储顶点、边和面之间的从属、包含及邻接关系。如当我们想要删除某个点,或者比如想要找到某个点的1-邻域点,这时我们往往要对点列表和面列表整体进行遍历搜索,这样开销是很大的,会直接影响到整个系统的效率。
为了提高点线面的查询或增删改操作的效率,半边数据结构中增加了“半边”的概念,为了方便表达拓扑关系,它将一条边表示成拓扑意义上方向相反的两条“半边”,所以称为半边数据结构。
下图为用半边数据结构表示的三角形网格的一部分。
半边结构由三个对象组成:顶点、半边、面。从上图中,我们可以看到半边(用橙黄色代表)会围绕着一个面的边缘形成一个循环列表,其环绕方向我们可以预先实现给定,这个面为半边所对应的面。每个半边存储一个指向它离开的顶点的指针、一个指向它相对的半边的指针、一个指向它对应的面的指针以及一个指向它的下一个半边的指针,类似如下:
struct HE_edge
{
HE_vert* vert; // vertex at the end of the half-edge
HE