转载自:http://www.tanglei.name/points-in-plane-with-delaunay-triangulation/
作业中遇到三角剖分的问题,关键字”三角剖分”出来最多的就是”Delaunay”三角剖分,整理了下相关资料,记录备忘。
1.三角剖分与Delaunay剖分的定义
2. Delaunay剖分的算法
3. Bowyer-Watson算法 VS Lawson 算法
如何把一个散点集合剖分成不均匀的三角形网格,这就是散点集的三角剖分问题,散点集的三角剖分,对数值分析以及图形学来说,都是极为重要的一项预处理技术。该问题图示如下:
三角剖分:假设V是二维实数域上的有限点集,边e是由点集中的点作为端点构成的封闭线段, E为e的集合。那么该点集V的一个三角剖分T=(V,E)是一个平面图G,该平面图满足条件:
1.除了端点,平面图中的边不包含点集中的任何点。
2.没有相交边。
3.平面图中所有的面都是三角面,且所有三角面的合集是散点集V的凸包(在二维欧几里得空间中,凸包可想象为一条刚好包著所有点的橡皮圈)。
在实际中运用的最多的三角剖分是Delaunay三角剖分,它是一种特殊的三角剖分。
Delaunay边:假设E中的一条边e(两个端点为a,b),e若满足下列条件,则称之为Delaunay边:存在一个圆经过a,b两点,圆内(注意是圆内,圆上最多三点共圆)不含点集V中任何其他的点,这一特性又称空圆特性。
Delaunay三角剖分:如果点集V的一个三角剖分T只包含Delaunay边,那么该三角剖分称为Delaunay三角剖分。
要满足Delaunay三角剖分的定义,必须符合两个重要的准则:
1、空圆特性:Delaunay三角网是唯一的(任意四点不能共圆),在Delaunay三角形网中任一三角形的外接圆范围内不会有其它点存在。如下图所示:
2、最大化最小角特性:在散点集可能形成的三角剖分中,Delaunay三角剖分所形成的三角形的最小角最大。从这个意义上讲,Delaunay 三角网是”最接近于规则化的”的三角网。具体的说是指在两个相邻的三角形构成凸四边形的对角线,在相互交换后,六个内角的最小角不再增大。(如果将三角网中的每个三角形的最小角进行升序排列,则Delaunay三角网的排列得到的数值最大,从这个意义上讲,Delaunay三角网是”最接近于规则化”的三角网。)如下图所示:
最大化最小角特性是区分平面点集Delaunay三角剖分于高维点集所特有的性质。正式这一特性,delaunay剖分总是能尽可能避免病态三角形的出现,自动向等边三角形靠近,注意仅适用于平面点集,三维或者更高的delaunay三角剖分不具有相应的性质 (周知.三角剖分算法研究[D].哈尔滨理工大学,2007.)
理论上为了构造Delaunay三角网,Lawson提出的局部优化过程LOP(Local Optimization Procedure),一般三角网经过LOP处理,即可确保成为Delaunay三角网,其基本做法如下所示:
LOP处理过程如下图所示:
Delaunay剖分是一种三角剖分的标准,实现它有多种算法。本文讲的是逐点插入的两种算法。
逐点插入的Lawson算法是Lawson在1977年提出的,该算法思路简单,易于编程实现。基本原理为:首先建立一个大的三角形或多边形,把所有数据点包围起来,向其中插入一点,该点与包含它的三角形三个顶点相连,形成三个新的三角形,然后逐个对它们进行空外接圆检测,同时用Lawson设计的局部优化过程LOP进行优化,即通过交换对角线的方法来保证所形成的三角网为Delaunay三角网。
上述基于散点的构网算法理论严密、唯一性好,网格满足空圆特性,较为理想。由其逐点插入的构网过程可知,遇到非Delaunay边时,通过删除调整,可以构造形成新的Delaunay边。在完成构网后,增加新点时,无需对所有的点进行重新构网,只需对新点的影响三角形范围进行局部联网,且局部联网的方法简单易行。同样,点的删除、移动也可快速动态地进行。但在实际应用当中,这种构网算法当点集较大时构网速度也较慢,如果点集范围是非凸区域或者存在内环,则会产生非法三角形。
Lawson算法的基本步骤是:
最后删除超级三角形相关联的三角形即可。
Bowyer算法由英国Bath大学的Bowyer在1981年提出。算法首先构造离散点集的的若干离散点的Voronoi图,根据Voronoi领域准则连接临近点,得到初始Delaunay三角剖分,然后逐步加入剖分点,每加入一个点就对已有的Voronoi图进行修改,构造新点集的Voronoi图,直到所有点都插入完毕。具体论文是这篇Computing Dirichlet Tesselations。
Watson算法由澳大利亚悉尼大学Watson在1981年提出。算法采用空外接圆准则,直接从三角剖分入手。算法从初始三角划分开始,每加入一个离散点,找出所有外接圆包含此点的三角形,删除这些三角形面向该插入点的边,得到包含此点的多边形,将此点与多边形的定点连接就构成新的Delaunay三角剖分,重复此过程直至所有点插入完毕为止。注意,此算法当四点或以上共圆时将产生错误。论文是这篇Computing the n-Dimensional Delaunay Tessellation with Application to Voronoi Polytopes。
Bowyer-Watson算法是根据上述两者算法相互补充改进得到的(貌似跟Watson算法差不多,具体可以参考上述两篇论文),仍然是一种插点增量算法的一种。算法逻辑如下:
最后删除超级三角形相关联的三角形即可。
Bowyer-Watson算法和Lawson 算法区别和联系。
1. insert vertex p in V into triangulation
2. find circumcircles containing p with corresponding triangles
3. remove triangles to get insertion polygon
4. retriangulate insertion polygon by simply adding edges to p
1. insert vertex p in V into triangulation
2. triangulate new p (draw edges to p from enclosing triangle, creating traingles)
3. for all new triangles t created recursively:
check circumcircle of t, if containing neighbouring vertex,,flip
参考资料:
http://baike.baidu.com/view/1691145.htm
周知.三角剖分算法研究[D].哈尔滨理工大学,2007.
Henrik Zimmer. Voronoi and Delaunay Techniques.2005
面向科学计算的网格划分与可视化技术