编者按:本文作者奇舞团前端开发工程师魏川凯。
狄洛尼三角剖分(Delaunay triangulation)是指离散分布的点集P的其中一种三角剖分DT(P),可以使得点集P中没有任意一个点严格处于任意一个三角形的外接圆的内部。狄洛尼三角剖分构建的三角网可以尽量避免狭长三角形的出现,有效提高逼近精度,使得网格整体质量保持最优,在三维显示,图像处理,人工智能等领域被广泛运用。
上图为利用三角剖分构建三角网拟合我国某山脉地形
定义
空圆性:DT(P)是唯一的(任意四点不能共圆),在DT(P)中,任意三角形的外接圆范围内不会有其它点存在。
最大化最小角:在点集所有可能的三角剖分中,狄洛尼三角剖分所形成的三角形的最小角最大,也可以说在两个相邻的三角形构成凸四边形的对角线,在相互交换后,两个内角的最小角不再增大。
性质
最外部的三角形边的集合是点集的凸包。
以最接近的三个点形成三角形,且各线段(三角形的边)皆不相交。
不论从区域何处开始构建,最终都将得到一致的结果(点集中任意四点不能共圆)。
任意两个相邻三角形构成的凸四边形的对角线如果可以互换的话,那么两个三角形六个内角中最小角度不会变化。
在点集所有可能的三角剖分中,狄洛尼三角剖分所形成的三角形的最小角最大,至少狄洛尼三角剖分中的最小角与其他三角剖分中的最小角相等。
新增、删除、移动某一个顶点只会影响邻近的三角形。
与泰森多边形(Voronoi图)对偶。
算法
实现狄洛尼三角剖分的算法有很多,我们这里介绍其中一种:分治算法。这种算法主要过程是递归的分割点集直到子集大小不超过三,然后在合并的过程中逐渐选取最优点连接左右子集,最终完成三角剖分。
一般分为一下几个步骤完成。
将所有点的数组按照x坐标升序排序,如下图是排好序的点集。
将有序的点集递归的分成两个部分,直到子集大小不超过3。然后将这些子点集剖分成为一个三角形或者一条线段。
把已经剖分好的左右子点集可以依次合并。合并后的剖分包含左子点集的边(红色),右子点集的边(绿色),连接左右剖分产生的新的边(蓝色)。对于合并后的三角剖分,为了维持狄洛尼三角剖分原则,我们可能需要删除部分左子集边和右子集边。
合并左右子集首先是要确定一条基线(base