本文只是学习笔记,所有图和基本内容均出自原文。
一、三角剖分:
1.1 基础理论
给定的平面点集,生成三角形集合的过程。考虑平面(空间)点集P,得到三角形集合T:
a)所有三角形的端点恰好构成集合P。
b)任意两个三角形的边不相交(要么重合,要么没有交点)。
c)所有三角形的合集构成P的凸包(convex hull)。
凸包(Convex Hull)指的是一组点中最小的凸多边形或凸多面体,将这些点包围在内部,同时保持凸性。这个凸包的边界是由这些点构成的,包围内部的点集。
由于给定点集的三角剖分不唯一,三角形“质量”(quality)最好,不希望三角形过于狭长,也就是说越接近等边三角形越好:
a) 最小角(minimum angle):即所有三角形的内角当中最小的角。
b) 纵横比(aspect ratio):三角形最短边与最长边的比例。
c) 半径比(radius ratio):三角形内接圆半径的两倍与外接圆半径的比例。
1.2 空圆
空圆性质:即一个三角形(或边)的外接圆范围内(边界除外),不包含点集P中的任何顶点。
所有三角形的外接圆均满足空圆性质的三角剖分,称为一个Delaunay三角剖分。
对三角剖分中的一条边,若存在一个外接圆满足空圆性质,称为一条Delaunay边。(一条边的外接圆可以是经过这条边两个顶点的任意圆,不唯一。)
对三角剖分中的一条属于两个三角形 t1,t2 的边e,若存在一个外接圆不包含三角形 t1,t2中的任何顶点称为局部Delaunay边。若一条边只属于一个三角形,也属于局部Delaunay边。
1.3 Delaunay引理
对一个三角剖分T,以下三个命题相互等价
a) T中所有三角形均为Delaunay三角形。(Delaunay三角剖分的定义)
b) T中所有三角形的边均为Delaunay边。
c) T中所有三角形的边均为局部Delaunay边。
Jonathan Schewchuk---Delaunay triangulation
1.4 翻转边算法
翻转边算法 : 对三角剖分T中的一条边e,若它不是局部Delaunay的,则可以被翻转成为一条局部Delaunay边e’。
翻转:两个三角形的合集所构成的四边形有两条对角线,e为其中一条。现在用另一条对角线e’替换e。
每进行一次翻转边操作时,都把三角剖分“局部”地改善了:
a) 最小角增大:翻转边e后的两个相邻三角形的6个内角中的最小角大于等于原先的两个三角形6个内角中的最小角。
b) 外接圆半径缩小:翻转边e后的两个相邻三角形的外接圆半径最大值小于等于原先的两个三角形外接圆半径的最大值。
c) 四点共圆的情况:若一条边e的两个相邻三角形的顶点A,B,C,D四点共圆,则无论翻转与否,这条边都是局部Delaunay边。
1.5 剖分的最优性质
a) 最大化最小角性质:
在给定点集P的所有三角剖分当中,Delaunay三角剖分得到的最小角(所有三角形的内角中的最小值)是最大的。
b) 最小化外接圆性质:
在给定点集P的所有三角剖分当中,Delaunay三角剖分得到的最大外接圆半径(所有三角形的外接圆半径中的最大值)是最小的。
c)若点集P中任意四点不共圆,则存在唯一的Delaunay三角剖分T。若点集P中四点A,B,C,D共圆,且△ABC,△BCD属于Delaunay三角剖分T,那么将边BC翻转后得到的三角剖分T’(包含△ABD,△ACD)同样是一个Delaunay三角剖分。
二、Delaunay三角剖分的构造算法
Delaunay三角剖分的构造算法都是通过逐点插入来实现的。
而每当插入一个新的顶点时,将其与附近的旧顶点连接会加入一些新的边,我们只要用翻转边算法来修正其中的“坏边”,就可以将其重新“修复”为Delaunay三角剖分。
2.1 Lawson算法 (2D)
2.1.1 计算点集P的包围盒
先计算点集P的包围盒(bounding box),将包围盒的四个顶点加入P中得到P’。根据包围盒生成两个超三角形(super triangles),构成初始三角剖分 T0 。由于只包含两个直角三角形, T0 是(包围盒四个顶点的)一个Delaunay三角剖分。
这里的包围盒是点集的包围盒,在二维空间中,包围盒通常是矩形;而在三维空间中,它是一个长方体(或称为立方体)。
超三角形是大到足以容纳所有点的特殊三角形。在二维情况下,它们通常是一个大的等边三角形或者外接圆无限大的三角形。在三维空间中,它们可能是一个大的四面体或外接球无限大的四面体。
2.1.2 将点集P中的顶点逐一插入
将点集P中的顶点逐一插入现有的三角剖分 Ti 中,并进行如下调整:
➤设插入的顶点v位于三角形t中,将v与三角形的三个顶点连接,使t分裂为3个三角形 t1,t2,t3。(内部分裂)
➤分别检查 t1,t2,t3 是否满足空圆性质,若不满足则进行翻转边操作,直到没有坏边为止。此时得到一个包含顶点v的新Delaunay三角剖分。
2.1.3 最后删除
当最后一个顶点插入到三角剖分中,并且完成所有翻转边操作后,我们得到了点集P’的一个Delaunay三角剖分。现在删除第一步中加入的包围盒的四个顶点,并且去除所有与它们连接的三角形,则剩下的三角形就构成点集P的Delaunay三角剖分T。
总的思路就是,先构建一个大的三角形,然后逐步在三角形中插入点,一边插入,一边构成新的三角形一边优化。
2.2 Bowyer-Watson算法(2D)
在Lawson算法的基础上,可以再做一点改进:在插入新的顶点之后,不要立刻与旧顶点连接生成新的三角形,再去逐一翻转坏边。而是先去寻找哪些边是需要翻转的,直接将这些边删掉形成一个“空穴”(cavity),然后在空穴当中连接新的边。这就是Bowyer-Watson算法的思路。
a) 同Lawson算法
b) 将点集P中的顶点逐一插入现有的三角剖分中,并进行如下调整:
➤在现有三角剖分中,所有外接圆包含顶点v的三角形的合集构成一个“星形多边形”(star shaped polygon)。星形多边形的含义是多边形的任何一个顶点到v的连线都在多边形内部。
➤对于上述星形多边形,将其内部的三角形全部删除,形成一个“空穴”。将空穴边界的顶点与新添加的顶点v连接得到新的三角形,替代剖分中被删除的三角形,此时得到一个包含顶点v的新Delaunay三角剖分。
c) 同Lawson算法
三、基于Delaunay三角剖分的网格生成算法、
Delaunay平面区域网格生成算法
a)包围盒->两个超三角形作为初始三角网格。根据边界曲线生成边界点。
b) 将边界点逐一插入到三角网格中。每一步插入后,用Bowyer-Watson算法得到新的Delaunay三角网格。
c) 将第一步插入的辅助顶点删除(同时删除与其连接的三角形),得到关于全部边界点的Delaunay三角网格(亦即边界点的Delaunay三角剖分)。
d) 在区域内部的三角形,根据一定的条件,将重心(centroid)插入三角网格,并根据Bowyer-Watson算法调整,得到新的Delaunay三角剖分。直到不再有需要插入的重心点,此时得到区域的完整Delaunay三角网格。(?)
三维模型的Delaunay三角网格生成算法
生成三维模型的Delaunay 三角网格通常包含以下步骤:
-
点集确定: 首先确定三维空间中的一组点,这些点通常代表着模型的顶点或特征点。
-
超立方体的构建: 通过将点集放置在一个超立方体(三维情况下是一个立方体)内,找到能够包含所有点的最小立方体。
-
初始三角剖分: 利用超立方体的顶点生成初始的三角形网格,构成超立方体的外表面,这些三角形通常不是Delaunay 三角形。
-
进行Delaunay 三角剖分: 进行迭代算法,通过不断地对不符合Delaunay 三角形的三角形进行改进,直到所有的三角形都满足Delaunay 三角形的性质。
-
检查不满足的三角形: 针对每个不满足Delaunay 三角形条件的三角形,确定哪些顶点需要连接,以便使其满足Delaunay 三角形的要求。
-
边的翻转: 如果发现一个三角形不满足Delaunay 三角形条件,需要进行边的翻转。这意味着替换不符合条件的边为符合条件的边,以使新的三角形满足Delaunay 三角形的性质。
-
迭代: 反复执行翻转操作,直到所有的三角形都满足Delaunay 三角形的条件为止。这个过程可能需要多轮迭代,尤其在点集分布不规则或稀疏时。
-
-
输出: 得到满足Delaunay 三角形条件的三角网格作为最终的三维模型表示。
这里要注意的是,每个面上的点需要两份编号,一个局部(local)编号用于参数区域上的三角网格,及一个全局(global)编号用于三维空间的整体三角网格。在网格生成过程中需要时刻保持这两种编号的对应关系。
参考文献:
Lecture notes on Delaunay triangulation, Jonathan Richard Schewchuk
Delaunay三角剖分算法,百度百科
Delaunay triangulation, Wikipidea