德劳内三角网

德劳内三角(DelaunayTriangulation)

1、定义:

       它是对于平面上给定的一组离散的点集,对它进行三角划分
       Delaunay三角剖分其实并不是一种算法,它只是给出了一个“好的”三角网格的定义,它的优秀特性是空圆特性最大化最小角特性,这两个特性避免了狭长三角形的产生,也使得Delaunay三角剖分应用广泛。
       空圆特性其实就是对于两个共边的三角形,任意一个三角形的外接圆是空圆,不含有任何点,这种形式的剖分产生的最小角最大。
  德劳内三角网_第1张图片德劳内三角网_第2张图片

2、维诺图(Voronoi diagram):

对相邻的两个点之间作垂直频平分线,所构成的图叫又称泰森多边形。

德劳内三角网_第3张图片

它和德劳内三角网是对偶(Duality)的关系。

维诺图中的点是德劳内三角网三角形外接圆的圆心。
德劳内三角网_第4张图片

维诺图中两个点之间之所以连一条边,是因为反映的是德劳内三角网的三角形的邻接关系。

3、唯一性:

四点共圆是合法的:

德劳内三角网_第5张图片

如果不存在四点共圆,必然出现一种情况是合法的,也就是唯一性。

德劳内三角网_第6张图片

4、判断点的位置?

德劳内三角网_第7张图片

德劳内三角网_第8张图片

5、双向链接边表:

德劳内三角网_第9张图片
下面那条公式是欧拉公式。
德劳内三角网_第10张图片
德劳内三角网_第11张图片
德劳内三角网_第12张图片
德劳内三角网_第13张图片

怎么读图呢?
       可以通过f1找它的半边,一直一直找它的后继,就可以访问面所围成的半边;通过v2找它的后继,再访问它的twin,一直重复,来遍历一个顶点的所有入度出度。

6、如何在DCEL结构中添加结点呢?

       会引起一张平面被撕裂成三张平面,引入6条半边,一个顶点,并且会大量的对原先的三条半边进行前驱后继的修改。
德劳内三角网_第14张图片
原先e1的前驱是e2,现在变为了e3

德劳内三角网_第15张图片
德劳内三角网_第16张图片
半边修改的地方比较多。

7、边翻转

将原先的两条半边删除,引入两条新的半边。
德劳内三角网_第17张图片
德劳内三角网_第18张图片
德劳内三角网_第19张图片

8、算法的执行(The Implemation of RIC):

已掌握的技能(Mastered skills):

注:真不是屌英语,是英语真的很重要!!!

InTriangleTest(a,b,c,s); //判断一个点是否在三角形的内部
IncircleTest(a,b,c,s);//判断一个点是否在三角形外接圆的内部
AddingAvertex(DT(p),s);//增加一个节点
Edgeflipping(*);//边翻转

德劳内三角网_第20张图片
首先引入一个超三角形,它是做够大的三角形,以至于它把所有输入的点都包含在内;插入第一个点,这时仍能保持德劳内三角网,不需要进行修改;插入第二个节点的时候引入三条可移边,这三条边会连续进行边翻转操作;第一条边是超三角形的边,不需要进行边翻转,剔除;德劳内三角网_第21张图片
德劳内三角网_第22张图片
德劳内三角网_第23张图片
再引入一个点,去除外围边;德劳内三角网_第24张图片
剔除并进行翻转;
德劳内三角网_第25张图片
引入两条可移边,并判断,发现可行;
德劳内三角网_第26张图片德劳内三角网_第27张图片

最后一条边判断,发现仍然可行,此时就完成了对三个节点,进行的德劳内三角网构造的算法;    最后判断这三个点构成的三角形外接圆包不包含超三角形的三个顶点,不包含就将它输出;     最终的到的是这个三角形,也就是一张德劳内三角网。
德劳内三角网_第28张图片

9、算法思考?

如何进行点定位?

是怎么找到这个点是在这个面内的呢?引入一种结构——
刚开始的节点都在超三角形内部,这些节点构成了一个桶,从桶中随机挑选一个节点,进行插入,它会把这个面撕裂成三个部分,与此同时,点也被撕裂成了三个部分;那么下次随机挑选一个点的时候,只需要找到这个点所对应的桶号,桶号与点号建立了一一对应的关系。
德劳内三角网_第29张图片
在边翻转的过程中,点发生了什么变化呢?
显然我们只需要将这两个面内的所有节点进行归类,判断这个点是否在新的面内,如果在的话就加入这个桶,不在的话就加入另一个桶。

德劳内三角网_第30张图片

10、这个算法是正确的吗?是可靠的吗?

它能实现德劳内三角网的构造吗?
德劳内三角网_第31张图片
每次边翻转都会靠近蓝色的曲线,直到最后这个序列变成了蓝线;
显然,这张网中只会唯一得存在一个从小到大的序列,它是最平均的;
所以这个算法能够实现将离散的点集进行delanuay三角化。

11、算法性能:

在期望意义上讲时间和空间复杂度是不会超过O(nlogn) 和O(n)的。

Abstract
In this paper we give a new randomized incremental algorithm for the construction of planar Voronoi diagrams and Delaunay triangulations. The new algorithm is more “online” than earlier similar methods, takes expected time O(nlog n) and space O(n), and is eminently practical to implement. The analysis of the algorithm is also interesting in its own right and can serve as a model for many similar questions in both two and three dimensions. Finally we demonstrate how this approach for constructing Voronoi diagrams obviates the need for building a separate point-location structure for nearest-neighbor queries.

RIC算法主要的time costedge-flipping 和bucket的point location上面,所以将它们相加求和,就可以算出时间复杂度(time complexity).

德劳内三角网_第32张图片
我们在三角网中插入节点的时候,实际上进行的边翻转操作是在将那些不合法的边都剔除,然后将最外层的星形多边形上的点全部向节点引一条连线,这样就将它调整成了一个德劳内三角网;而调整所需要的数量,这些边翻转的操作刚好等于新型多边形边的数量,也等于向点引入的数量;它是不会超过6条的。
也就是说,我们只需要常数次的操作,就能将插入节点所引起的变化,调整为一个合法的德劳内三角网。
德劳内三角网_第33张图片
德劳内三角网_第34张图片

12、应用:

三维建模,low poly低多边形,面部构建等等。
德劳内三角网_第35张图片
德劳内三角网_第36张图片

德劳内三角网_第37张图片


德劳内三角网_第38张图片

德劳内三角网_第39张图片

你可能感兴趣的:(图形学,图形学,算法)