Delaunay三角剖分——BW算法
Delaunay 三角剖分
定义
在数学和计算几何中,对于给定的平面中的离散点集P ,其 Delaunay 三角剖分 DT() 满足:
- 空圆性:DT(P) 是 唯一 的(任意四点不能共圆),在 DT(P) 中,任意 三角形的外接圆范围内不会有其它点存在。
- 最大化最小角:在点集P 可能形成的三角剖分中,DT(P) 所形成的三角形的最小角最大。从这个意义上讲,DT(P) 是 最接近于规则化 的三角剖分。具体的说是在两个相邻的三角形构成凸四边形的对角线,在相互交换后,两个内角的最小角不再增大。
性质
- 最接近:以最接近的三点形成三角形,且各线段(三角形的边)皆不相交。
- 唯一性:不论从区域何处开始构建,最终都将得到一致的结果(点集中任意四点不能共圆)。
- 最优性:任意两个相邻三角形构成的凸四边形的对角线如果可以互换的话,那么两个三角形六个内角中最小角度不会变化。
- 最规则:如果将三角剖分中的每个三角形的最小角进行升序排列,则 Delaunay 三角剖分的排列得到的数值最大。
- 区域性:新增、删除、移动某一个顶点只会影响邻近的三角形。
- 具有凸边形的外壳:三角剖分最外层的边界形成一个凸多边形的外壳。
BW算法
简介
Bowyer-Watson算法是一种增量算法。它的工作原理是将点一次一个地,添加到所有点的子集的Delaunay三角剖分中。每次插入新点后,任何外接圆包含新点的三角形都被删除,留下一个星形多边形孔,然后使用新点重新三角化。
首先:insert a node in an enclosing "super"-triangle
Insert second node
Insert third node
Insert fourth node
Insert fifth (and last) node
Remove edges with extremes in the super-triangle
步骤
逐点插入算法中的Bowyer-Watson算法的基本步骤是:
1. 构造一个超级三角形,包含所有散点,放入三角形链表。
2. 将点集中的散点依次插入,在三角形链表中找出其外接圆包含插入点的三角形(称为该点的影响三角形),删除影响三角形的公共边,将插入点同影响三角形的全部顶点连接起来,从而完成一个点在Delaunay三角形链表中的插入。
3. 根据优化准则对局部新形成的三角形进行优化。将形成的三角形放入Delaunay三角形链表。
4. 循环执行上述第2步,直到所有散点插入完毕。
这一算法的关键的第2步图示如下:
BW算法伪代码
1 function BowyerWatson (pointList) 2 // pointList is a set of coordinates defining the points to be triangulated 3 triangulation := empty triangle mesh data structure 4 add super-triangle to triangulation // must be large enough to completely contain all the points in pointList 5 for each point in pointList do // add all the points one at a time to the triangulation 6 badTriangles := empty set 7 for each triangle in triangulation do // first find all the triangles that are no longer valid due to the insertion 对应第2步:新插入点是否在三角形外接圆中 8 if point is inside circumcircle of triangle 9 add triangle to badTriangles 10 polygon := empty set 11 for each triangle in badTriangles do // find the boundary of the polygonal hole 比如图中的ABCD 12 for each edge in triangle do 13 if edge is not shared by any other triangles in badTriangles 14 add edge to polygon 15 for each triangle in badTriangles do // remove them from the data structure 16 remove triangle from triangulation 17 for each edge in polygon do // re-triangulate the polygonal hole 18 newTri := form a triangle from edge to point 19 add newTri to triangulation
20 for each triangle in triangulation // done inserting points, now clean up 插完所有点了,现在清理掉外围的三角形,如下图中的蓝色三角形之外的三角形。 21 if triangle contains a vertex from original super-triangle 22 remove triangle from triangulation 23 return triangulation
参考链接:
https://en.wikipedia.org/wiki/Bowyer%E2%80%93Watson_algorithm
https://github.com/bl4ckb0ne/delaunay-triangulation
https://blog.csdn.net/longlongqin/article/details/104497533