转载自:http://www.tanglei.name/points-in-plane-with-delaunay-triangulation/

作业中遇到三角剖分的问题,关键字”三角剖分”出来最多的就是”Delaunay”三角剖分,整理了下相关资料,记录备忘。

1.三角剖分与Delaunay剖分的定义

2. Delaunay剖分的算法

3. Bowyer-Watson算法 VS Lawson 算法

1.三角剖分与Delaunay剖分的定义

如何把一个散点集合剖分成不均匀的三角形网格,这就是散点集的三角剖分问题,散点集的三角剖分,对数值分析以及图形学来说,都是极为重要的一项预处理技术。该问题图示如下:

1.1 三角剖分定义

三角剖分:假设V是二维实数域上的有限点集,边e是由点集中的点作为端点构成的封闭线段, E为e的集合。那么该点集V的一个三角剖分T=(V,E)是一个平面图G,该平面图满足条件:
1.除了端点,平面图中的边不包含点集中的任何点。
2.没有相交边。
3.平面图中所有的面都是三角面,且所有三角面的合集是散点集V的凸包(在二维欧几里得空间中,凸包可想象为一条刚好包著所有点的橡皮圈)。

1.2. Delaunay三角剖分的定义

在实际中运用的最多的三角剖分是Delaunay三角剖分,它是一种特殊的三角剖分。

Delaunay边:假设E中的一条边e(两个端点为a,b),e若满足下列条件,则称之为Delaunay边:存在一个圆经过a,b两点,圆内(注意是圆内,圆上最多三点共圆)不含点集V中任何其他的点,这一特性又称空圆特性。
Delaunay三角剖分:如果点集V的一个三角剖分T只包含Delaunay边,那么该三角剖分称为Delaunay三角剖分。

1.3.Delaunay三角剖分的准则

要满足Delaunay三角剖分的定义,必须符合两个重要的准则:

1、空圆特性:Delaunay三角网是唯一的(任意四点不能共圆),在Delaunay三角形网中任一三角形的外接圆范围内不会有其它点存在。如下图所示:

2、最大化最小角特性:在散点集可能形成的三角剖分中,Delaunay三角剖分所形成的三角形的最小角最大。从这个意义上讲,Delaunay 三角网是”最接近于规则化的”的三角网。具体的说是指在两个相邻的三角形构成凸四边形的对角线,在相互交换后,六个内角的最小角不再增大。(如果将三角网中的每个三角形的最小角进行升序排列,则Delaunay三角网的排列得到的数值最大,从这个意义上讲,Delaunay三角网是”最接近于规则化”的三角网。)如下图所示:

最大化最小角特性是区分平面点集Delaunay三角剖分于高维点集所特有的性质。正式这一特性,delaunay剖分总是能尽可能避免病态三角形的出现,自动向等边三角形靠近,注意仅适用于平面点集,三维或者更高的delaunay三角剖分不具有相应的性质 (周知.三角剖分算法研究[D].哈尔滨理工大学,2007.)

1.4.Delaunay三角剖分的特性

  1. 最接近:以最近临的三点形成三角形,且各线段(三角形的边)皆不相交。
  2. 唯一性:不论从区域何处开始构建,最终都将得到一致的结果。(注意出现四个或者更多的节点共外接圆的特殊情况时,delaunay三角划分不唯一[王成恩,2011])
  3. 最优性:任意两个相邻三角形形成的凸四边形的对角线如果可以互换的话,那么两个三角形六个内角中最小的角度不会变大。
  4. 最规则:如果将三角网中的每个三角形的最小角进行升序排列,则Delaunay三角网的排列得到的数值最大。
  5. 区域性:新增、删除、移动某一个顶点时只会影响临近的三角形。
  6. 凸包性:三角网最外层的边界形成一个凸多边形的外壳。

1.5.局部最优化处理

理论上为了构造Delaunay三角网,Lawson提出的局部优化过程LOP(Local Optimization Procedure),一般三角网经过LOP处理,即可确保成为Delaunay三角网,其基本做法如下所示:

  1. 将两个具有共同边的三角形合成一个多边形。
  2. 以最大空圆准则作检查,看其第四个顶点是否在三角形的外接圆之内。
  3. 如果在,修正对角线即将对角线对调,即完成局部优化过程的处理。

LOP处理过程如下图所示:

2.Delaunay剖分的算法

Delaunay剖分是一种三角剖分的标准,实现它有多种算法。本文讲的是逐点插入的两种算法。

2.1.Lawson算法

逐点插入的Lawson算法是Lawson在1977年提出的,该算法思路简单,易于编程实现。基本原理为:首先建立一个大的三角形或多边形,把所有数据点包围起来,向其中插入一点,该点与包含它的三角形三个顶点相连,形成三个新的三角形,然后逐个对它们进行空外接圆检测,同时用Lawson设计的局部优化过程LOP进行优化,即通过交换对角线的方法来保证所形成的三角网为Delaunay三角网。

上述基于散点的构网算法理论严密、唯一性好,网格满足空圆特性,较为理想。由其逐点插入的构网过程可知,遇到非Delaunay边时,通过删除调整,可以构造形成新的Delaunay边。在完成构网后,增加新点时,无需对所有的点进行重新构网,只需对新点的影响三角形范围进行局部联网,且局部联网的方法简单易行。同样,点的删除、移动也可快速动态地进行。但在实际应用当中,这种构网算法当点集较大时构网速度也较慢,如果点集范围是非凸区域或者存在内环,则会产生非法三角形。

Lawson算法的基本步骤是:

  1. 构造一个超级三角形,包含所有散点,放入三角形链表。(求解离散点集的凸包,建立点集凸包边界节点的初始Delaunay三角剖分)
  2. 将点集中的散点依次插入,在三角形链表中找出包含插入点的三角形(只是点在内部,不是外接圆),将插入点同此三角形的全部顶点连接起来,构成三个小三角形。
  3. 分别构造没个小三角形的外接圆,检测外接圆是否包含其他三角形顶点,如果三个三角形外接圆均不包含,则继续第二步插入新的点。若某个新三角形包含其他三角形顶点,则采用互换对角线方式形成新的局部Delaunay三角形,再判断新形成的局部delaunay三角形是否包含其他三角形顶点,直至新形成的局部delaunay三角形不包含其余三角形顶点。
  4. 循环执行上述第2步,直到所有散点插入完毕。

最后删除超级三角形相关联的三角形即可。

2.2 Bowyer-Watson算法

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算法差不多,具体可以参考上述两篇论文),仍然是一种插点增量算法的一种。算法逻辑如下:

  1. 求解离散点集的凸包,建立点集凸包边界节点的初始三角形划分;
  2. 选择另外的离散点,插入指定位置,在已有的三角形中找出外接圆包含此点的三角形,并删除公共边,得到一个包含新插入点的多边形;
  3. 将此点与多边形的其他顶点连接起来,构成新的三角形划分;
  4. 重复插点知道所有点插入完毕。

最后删除超级三角形相关联的三角形即可。

3.Bowyer-Watson算法 VS Lawson 算法

Bowyer-Watson算法和Lawson 算法区别和联系

3.1 Bowyer-Watson Algorithm

  • form super triangle, enclosing all points p in V
  • as long as not all vertices of V have been treated, do:

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

  • remove super triangle

3.2 Lawson Algorithm

  • form super triangle, enclosing all points p in V
  • as long as not all vertices of V have been treated, do:

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

  • remove super triangle

参考资料:

http://baike.baidu.com/view/1691145.htm

周知.三角剖分算法研究[D].哈尔滨理工大学,2007.

Henrik Zimmer. Voronoi and Delaunay Techniques.2005

面向科学计算的网格划分与可视化技术



Delaunay Triangulation相关推荐

  1. Delaunay triangulation network怎么理解

    三角形分割 之前画球的时候,因为想把球的模型变成 Wavefront .obj file,所以当时想的是分割办法是这样来分割三角形: 包括之前尝试用Beizer曲线来画Utah teapot也都是采用 ...

  2. python三角网格代码_Python 实现 Delaunay Triangulation

    Delaunay Triangulation 是一种空间划分的方法,它能使得分割形成的三角形最小的角尽可能的大,关于 Delaunay Triangulation 的详细介绍,请参考这里,Delaun ...

  3. Jonathan Richard Shewchuk的德罗奈三角化(Delaunay Triangulation) 崩溃(Crash)问题

    Jonathan Richard Shewchuk的德罗奈三角化(Delaunay Triangulation) 崩溃(Crash)问题 研究网格化的同学一定知道德罗奈三角化(Delaunay Tri ...

  4. 笔记:Delaunay三角剖分(Delaunay Triangulation)相关知识

    最近接触到计算Delaunay三角剖分的问题,也算是计算几何的一个经典问题了.按照别人的算法,也自己实现了个( 源代码下载 ),发现点集大的时候,程序计算起来特慢.后来分析发现,别人程序号称的都是O( ...

  5. python画点云_python scipy Delaunay绘制点云

    编辑:同时绘制凸面外壳import numpy as np from scipy.spatial import Delaunay points = np.random.rand(30, 2) # 30 ...

  6. Delaunay三角剖分----OpenCV

    转自:https://blog.csdn.net/newthinker_wei/article/details/45598769 相关文章:OpenCV三角剖分的遍历和纹理映射:http://blog ...

  7. Delaunay 三角剖分2D(原理 + 源码)

    文章目录 Delaunay 三角剖分 代码实现< C++版本 > 代码实现< Python 版本 > 代码实现< Matlab 版本 > 彩蛋:一个很牛掰的算法学习 ...

  8. 如何使用OpenCV进行Delaunay三角剖分和Voronoi图

    图1.左:使用dlib检测到具有标志性建筑的奥巴马总统图像.中心:地标的Delaunay三角剖分.右:对应的Voronoi图. 俄国数学家鲍里斯·尼古拉耶维奇·德劳内(Boris Nikolaevic ...

  9. openCV【实践系列】5——使用OpenCV进行Delaunay三角剖分

    使用OpenCV进行Delaunay三角剖分和Voronoi图 图1:左图奥巴马总统使用dlib检测到标志点,中间Delaunay三角剖分的标志点,右图:相应的Voronoi图     在面部标志的众 ...

最新文章

  1. python数据结构 树_python数据结构之二叉树的建立实例
  2. Dbeaver连接MySQL
  3. HTML meta使用
  4. UIScrollView的简单使用
  5. 联合使用 HTML 5、地理定位 API
  6. s3k3 破旧不堪的拐杖被扔出去几米远
  7. 故宫院长发话了:以后端午中秋等节日也能夜游故宫
  8. python2还是3好_学Python2还是python3 究竟哪个好
  9. ubunut 安装 pyqt5
  10. 苹果Magic Trackpad2成功被谷歌团队写进去个Linux
  11. 关于node debug myscript.js的问题
  12. 【Kay】Java多线程
  13. dispatch_barrier_GCD学习之dispatch_barrier_async详解
  14. L1正则项-稀疏性-特征选择
  15. zabbix web监控 一: zabbix3.2添加web页面监控(Web monitoring)
  16. 【H5+来实现】uni-app框架如何跳转到第三方url或调用第三方APP
  17. 2008ESRI用户大会问答之ArcGIS部分
  18. 实现一个Android锁屏App功能的难点总结
  19. 忌:以不专业去瞎指挥专业,以一知半解去瞎指挥一线实践
  20. 常用的数据资源网(免费)

热门文章

  1. 阿里大于短信接口php,附件六 阿里大于短信接口
  2. KISSY 1.3.0 发布,淘宝 Web UI 库
  3. R语言与Markov Chain Monte Carlo(MCMC)方法学习笔记(2)
  4. css中div中的内容居中
  5. 思科设备策略路由配置
  6. 六年级计算机应用计划,最新小学六年级信息技术教师工作计划
  7. 疯狂iOS 讲义(上) Objective-C 2.0与iPhone/iPad应用开发基础
  8. 危机下毕业生求职的16条忠告
  9. 通俗易懂方差(Variance)和偏差(Bias)
  10. 使用EasyExcel做excel文件解析