表示多边形网格(polygon mesh)的一个常用方式就是使用共享的顶点列表和面的列表(里面包含面所含的顶点)。这样的表示方法在许多情况下都非常方便和高效,但是在某些特定的领域,反而会比较低效。
举例来说,网格简化(mesh simplification)通常需要把一条边退化成一个顶点。这个操作需要删除与这条边邻接的面并且更新面中存储的与这条边相关的顶点数据。这种多边形“手术”需要我们了解网格的组成部分的邻接关系,例如面和顶点。虽然我们肯定可以用之前提及的网格表示方法来实现网格简化,但是代价会比较高。许多情况下需要遍历面或者点的列表,甚至两者都要。
其他类似的多边形网格的邻接性查询还包括:
哪些面使用这个顶点?
哪些边使用这个顶点?
那些面以这条边为边界?
哪些边在这个面上?
哪些面在与这个面邻接?
为了高效实现这些邻接性查询,人们开发了更加复杂的边表示方法(b-reps)来显式描述顶点、边还有面的邻接信息。
这之中最常用的是
Winged-Edge数据结构,其中每条边包含了指向其两个顶点,两个邻接面的指针以及指向从其终点延伸出去的四条边的指针。这种结构可以让我们在常数时间内判断哪些点与面与该边连接,但是面对其他类型的查询,这种结构会带来更大的开销。
半边(half-edge)数据结构是一种略微复杂的边表示方法(b-reps)并且在其上做之前提到的所有操作都可以在常数时间完成。更优秀的是,即使包含了面、顶点和边的邻接信息,数据结构的大小是固定的且紧凑的。
这些特性是的半边数据结构成为了许多应用的最佳选择,但是其只能表示
流形表面(
manifold surfaces),而在某些情况下被证明是不可用的。流形的数学定义指的是曲面上的每一点都被其附近的复合盘的拓扑结构的区域包围(注:这句话好难翻译,建议直接看英文wiki)。对于多边形网格来说,这意味着每条边是且只能是两个面的边,t-junctions和internal polygons和网格中的空缺时,不能使用半边结构(这里术语就不翻译了)。