Delaunay三角剖分原理及Qt程序实现

来源:互联网 发布:金陵科技学院网络 编辑:程序博客网 时间:2024/06/07 07:50

给老师做完项目已经过去一段时间了,回想一下项目中学习到的东西,觉得还是找个地方记下来比较好,当然这也是第一写博客,写的不好还请见谅~下面开始正题

Delaunay三角剖分介绍

如图所示

图中的实线对应的是原有点集PS所对应的三角剖分,而虚线所对应的是Voronoi图,Voronoi图中每一个多边形内部的点,与此多边形内部的PS点集中的点最近(可以从虚线是对应实线的垂直平分线看出)其实Voronoi图也叫泰森多边形,在统计学习里面又称为k-NN模型中的1-NN模型,在此对Voronoi图不作太多说明。
 Delaunay三角剖分具有很好的理论基础和数学特性,其数学的良好特性可以从三角形的最小角最大化可以看出,也就是尽量让PS点集剖分的三角形都接近于锐角三角形,由此我们得出一个较为普适的准则来判断一个三角剖分是不是Delaunay三角剖分
Delaunay准则:
在三角剖分中,外接圆内部不包含任何网格顶点(PS集中的点)的三角形成为符合Delaunay准则的三角形,Delaunay准则也被称为空外接圆准则
因此,在Delaunay三角剖分中的每一个三角形都因该满足Delaunay准则,此准则在后面我们进行剖分的时候会有很重要的判别作用
闲话不多说了,下面就开始剖分步骤:
使用的是经典的Delaunay三角化方法——增量算法,又称为Bowyer-Watson算法,示意图如下:

当新增加 一个点时,遍历所有的三角形,如果此三角形的外接圆包含这个新点,则将这些三角形从三角形列表中删除,并将这些三角形的三个顶点与此点相连,所形成的新的三角形放入三角形列表中,可能会问,一开始哪有什么三角形网格(列表)。方法:一开始我们会建立一个超级大的三角形,以至于可以包含所有PS中的点,作为初始的三角形列表,这样就可以开始后面的步骤了吧~

算法输入 一个点集PS
算法输出:点集PS 的Delaunay三角剖分DTS(PS)
算法的步骤:
1.生成一个包含此点集合PS 中所有点的超级三角形T0作为初始的Delaubay三角网格(列表),记下T0的顶点
2.任意的P属于PS
1)将外接圆包含P的三角形全部找出,记下这些三角形所组成的区域边界,并删除这些三角形
2)将点P和空洞边界上的每一个边连成的新的三角形,并且加入三角形网格(列表)中
3任意的T属于三角形列表,如果T的顶点中含有超级三角形的顶点,将此三角形删去
算法结束

至于如何判断一个三角形是否包含新加入点的方法,由于时间太久,印象不深了,好像是向量叉乘,代码中应该会有~当然也可以用外接圆的半径来判断新点是否在三角形的外接圆中
剖分后的效果
代码链接:
http://download.csdn.net/detail/eularisu/9769996
0 0
原创粉丝点击