一、Lawson算法
Lawson算法是一种基于点插入的Delaunay三角剖分算法。该算法通过不断地向剖分中加入点,来逐步构建整个Delaunay三角剖分。该算法思路简单,易于编程实现。
Lawson算法基本原理为:首先建立一个大的三角形或多边形,把所有数据点包围起来,向其中插入一点,该点与包含它的三角形三个顶点相连,形成三个新的三角形,然后逐个对它们进行空外接圆检测,同时用Lawson设计的局部优化过程LOP进行优化,即通过交换对角线的方法来保证所形成的三角网为Delaunay三角网。
Lawson算法中的局部优化过程(LOP:Local Optimization Procedure)是逐点插入法的关键,局部优化过程的思路是,如果一个三角形不符合Delaunay三角剖分的规则,则将一个包含一对三角形的四边形的对角线对换,从而构成符合Delaunay三角剖分的新三角形。简单来说,Lawson算法通过不断地将剖分中非Delaunay边上的点进行“翻转”,使得该边成为Delaunay边,直到所有边都是Delaunay边为止。
该算法基于散点的构网算法理论严密、唯一性好,网格满足空圆特性,是一种比较理想的算法。其逐点插入的构网过程中如果遇到非Delaunay边时,可以通过删除调整,进而构造形成新的Delaunay边。在完成构网后,增加新点时,无需对所有的点进行重新构网,只需对新点的影响三角形范围进行局部构网。但是在实际应用当中,点集数量较大,分布复杂时构网速度较慢,而且对于区域为非凸,存在内环时,则会产生非法三角形。
具体实现步骤如下:
a) 构建包含所有点的超级三角形(super triangles)T(p0p1p2),将超级三角形加入T中构成初始三角剖分。
b) 将点集P中的顶点Pr逐一插入现有的三角剖分T 中,并进行如下调整:
➤定位包含点Pr的三角形PiPjPk;
➤若插入的顶点pr位于三角形PiPjPk内部,将pr与三角形的三个顶点连接,生成三条边,从而将三角形PiPjPk一分为三。
➤若pr 正好落在三角形PiPjPk 的某一条边上(假设为PiPj),找到与与PiPj关联的另一三角形的第四个顶点Pl,将Pr 分别与Pl、Pk 联接起来,从而将与PiPj相关联的两个三角形划分成四个三角形;
➤分别检查新生成的边是否满足Delaunay准则(空圆性),若不满足则进行翻转边操作(将坏边PiPj翻转为PrPk),翻转后对新生成的变也进行空圆检测,若存在坏边则继续翻转,直到没有坏边为止。
c) 将与超级三角形顶点p-1, p-2, p-3 以及与之关联的所有边都删除,则剩下的三角形就构成点集P的Delaunay三角剖分T。
二、Bowyer-Watson算法
Bowyer算法由英国Bath大学的Bowyer在1981年提出。算法首先构造离散点集的的若干离散点的Voronoi图,根据Voronoi领域准则连接临近点,得到初始Delaunay三角剖分,然后逐步加入剖分点,每加入一个点就对已有的Voronoi图进行修改,构造新点集的Voronoi图,直到所有点都插入完毕。
Watson算法由澳大利亚悉尼大学Watson在1981年提出。算法采用空外接圆准则,直接从三角剖分入手。算法从初始三角划分开始,每加入一个离散点,找出所有外接圆包含此点的三角形,删除这些三角形面向该插入点的边,得到包含此点的多边形,将此点与多边形的定点连接就构成新的Delaunay三角剖分,重复此过程直至所有点插入完毕为止。注意,此算法当四点或以上共圆时将产生错误。
Bowyer-Watson算法是根据上述两者算法相互补充改进得到的,仍然是一种插点增量算法的一种。其主要思想是通过不断地删除不符合Delaunay条件的三角形来构建整个剖分。具体来说,Bowyer-Watson算法插入点时判断网格中的三角形的外接圆是否包含该点,如果是,则删除该三角形,并用该点和剩余的边构造新的三角形,直到所有点都被加入到剖分中为止。
具体实现步骤如下:
a) 构建初始超级三角形,包含所有散点,放入三角形链表(同Lawson算法);
b) 将点集P中的顶点逐一插入现有的三角剖分中,在三角形链表中找出其外接圆包含插入点的三角形(称为该点的影响三角形),删除影响三角形的公共边,将插入点同影响三角形的全部顶点连接起来,从而完成一个点在Delaunay三角形链表中的插入;
c) 将与超级三角形顶点以及与之关联的所有边都删除。
总结
由于Delaunay三角剖分的唯一性,两种算法在效果上没什么区别。但Bowyer-Watson算法因为缩短了搜索坏边的过程,效率更高一些,所以在实际应用中我们往往会使用Bowyer-Watson算法。