一、为什么需要半边结构
多边形网格(polygon mesh)的一个常用方式就是使用共享的顶点列表和面的列表(例如OBJ模型文件,如下图),这样的表示方法在许多情况下都非常方便和高效,但是在某些特定的领域(临近查询),反而会效率比较低。
在一个多边形网格上其他类型的的临近查询包括:
- 哪条边用到了这个点
- 哪条边用到这个点
- 哪个面临近这条边
- 哪条边临近这个面
- 哪个面临近这个面
半边(half-edge)数据结构是一种略微复杂的边表示方法,并且在上面提到的所有操作都可以在常数时间完成。更优秀的是,即使包含了面、顶点和边的邻接信息,数据结构的大小是固定的(没有使用动态数组)且紧凑的。
二、详细数据结构
在给出半边的具体结构之前,先列出若干基本假设:
- 三维模型包含顶点、边、面片三部分结构,在空间中分别是0维、1维和2维的。面即为物体表面的某一多边形区域,边是相邻两个面的交线段或一个面的边缘,顶点为相邻边的交点。
- 每条边只与最多两个面相邻
- 每个面片均有自己的朝向,以区分内侧和外侧
- 两个相邻的面片朝向相同
半边数据结构中包含了三种对象:顶点、半边和面片。每个对象均为固定长度,并包含了指向其他对象的指针。详细说明见下图: