多边形三角剖分问题的综述

问题描述

多边形是由一系列首尾连接的直线段组成的图形。如果在多边形的所有边中,任意选一条边无限延长,其他各边都在此直线的同旁,那么这个多边形就是凸多边形,反之就是凹多边形。
三角剖分是代数拓扑学里最基本的研究方法。我们以平面为例,把平面剖开成一块块碎片,要求满足下面条件:1)每块碎片都是三角形;2)任意两个三角形,要么不相交、要么恰好相交于一条公共边。
Delaunay三角剖分是三角剖分中最经典的方法,单纯解释Delaunay三角剖分很不容易理解,已知Voronoi图和Delaunay三角剖分是对偶关系,通过Voronoi图就可以更好的理解Delaunay三角剖分。
Voronoi图是计算几何里的一种基于距离的平面划分的方法。在平面中有n个不重合的种子点,将相邻种子点的垂直平分线做出,形成许多交点,可以看出每个交点都是由三条边相交而成的。下图的实线部分就是一个Voronoi图。
图中的虚线部分就是与该Voronoi图对偶的Delaunay图

剖分算法

现存的关于Delaunay的剖分算法有很多,有分割合并算法逐点插入算法、Bowyer-Watson算法等。这其中最普遍和简单的算法是逐点插入法,又叫Lawson算法。这个算法通过逐点插入的方法实现,实现起来比较简单,但在实际实现过程中,可能出现当点集过大时,构网速度会变得较慢,且当点集范围是非凹区域或者存在内环,则会产生非法三角形。

Lawson算法:

1.构造一个超级三角形,包含所有散点,放入三角形链表中。
2.将点集中的点一次插入,在链表中找出其外接圆包含的插入点的三角形,删除影响三角形的公共边,将插入点同影响三角形的全部的顶点链接,从而完成一个点的插入。
3.根据优化准则对新形成的三角形进行优化,并将该三角形放入三角形链表。
4.循环2、3,直到所有点循环完毕。

利用队列的基边算法

这里主要介绍另外一种简单多边形借助队列的基边生成算法。
算法描述:
1.先按照逆时针方向的顺序将多边形的顶点P1,P2,P3…依次读入到队列中。
2.取出队列中的两个点初始点,由这两个顶点形成一个初始边叫做基边,也就是开始时基边就是由P1P2组成的边。
3.把基边的起始点付给Ps,结束点付给Pe。
4.当队列不为空时,在队列中取出下一个顶点Px,如果该点在基边的左侧,则连接Px和Pe形成新的线段PxPe,分两种情况:PxPe和多边形除端点外不相交,则将三角形的三个顶点Ps,Px-1,Px压入栈中,并把基边改为PePx,返回3;若PxPe和多边形还有其他交点,则Ps入队列,基边变为Px-1Pe,返回3;否则Px加入队列,基边变为Px-1Px,返回3.
5.将栈中的顶点依次出栈,每次三个顶点作为一个三角形,直至栈为空。

评价标准

Lawson算法:

Lawson算法是基于散点的构网算法实现的,该算法有较好的理论严密性,简单易实现,较为理想,由其算法可以看出,在逐点插入的过程中,遇到非Delaunay边时可以通过删除调整形成新的边。但是由下图可以看出,当区域存在内环时,则会在内环中产生非法三角形。在这里插入图片描述
在这里插入图片描述
上述图片分别为:离散点集合、正确的三角剖分和Lawson三角剖分。

利用队列的基边算法:

算法通过判断某顶点和基边之间的相对位置来实现对简单多边形的三角剖分,按照不同的相对位置,来判断三角形的是否生成。但由于是按照逆时针(顺时针)依次生成的,所生成的三角形可能不是最佳的剖分,但算法也是容易实现,容易理解,适用于所有的简单多边形,但算法也有弊端,无法实现对非简单多边形的三角剖分。

查看原文

猜你喜欢

转载自blog.csdn.net/wokeyia/article/details/120795753