清华计算几何大作业(四):CG2017 PA3-1 Delaunay Triangulation (Delaunay三角剖分)

1. 前置知识

  1. 计算几何算法:Delaunay Triangulation,详见教材 9.2 Delaunay 三角剖分(9.2 The Delaunay Triangulation)
  2. DCEL
  3. In Circle Test
  4. Voronoi Diagrams,了解其基本性质即可,本题无需掌握;

这里给到必要观看的视频课程章节,这些内容对理解和实现 Delaunay 三角剖分 算法至关重要,标记有绿色√为必看章节:

在这里插入图片描述

2. 思路分析

问题描述:CG2017 PA3-1 Delaunay Triangulation (Delaunay三角剖分)

这题的解题思路不难,就是根据Delaunay Triangulation算法的思路去实现就行了,这里着重给大家分享一下实现方面的两个细节:1)两个无限点的理解(p-1 和 p-2),2)以及两个无限点在实现上面的思路。在教材上面给到了它们的两个判定思路,第一个是点定位的方向:

在点定位阶段,需要判断点 pj 相对于有向直线pipk的位置。得益于以上 p-1 和 p-2 的选取方法,以下条件都是等价的1

  • pj位于有向直线pip-1的左侧;
  • pj位于有向直线p-2pi的左侧;
  • 按字典序,pj大于 pi。

关于这点笔者对其进行了拓展总结,归纳pj到直线pipk两个方向的判别方法:

1)当直线仅包含p-1:

  • pj位于有向直线pip-1的左侧,当且仅当pj > pi;

  • pj位于有向直线p-1pi的左侧,当且仅当pi > pj;

2)当直线仅包含p-2:

  • pj位于有向直线p-2pi的左侧,当且仅当pj > pi;

  • pj位于有向直线pip-2的左侧,当且仅当pi > pj;

3)当直线同时包含p-1p-2:

  • 无论哪个方向,pj总是位于 有向直线p-1p-2 或 有向直线p-2p-1 的左侧。

运用这个规律,我们就能判断某个插入点位于哪个三角形之中(或三角形边上)。除了这个规律,教材上还有一个关于无限点的思路,用于判断哪些边为无效边:

在判断某条边的合法性时,又该如何处理 p-1和 p-2 呢?设待测试的边为pipj,设与该边关联的两个三角形(如果都存在的话)的第三个顶点分别为 pk和 pl。1

  • pipj为三角形 p0p-1p-2 的一条边。这类边必定合法。
  • 下标 i、j 和 k 均非负。这是最常见的情况,参与测试的这些点都不是当做符号来处理的。因此,pipj非法,当且仅当 pl 落在 pi、pj和 pk 的外接圆内。
  • 所有其余的情况。这些情况下,pipj合法当且仅当min(k, l) < min(i, j)

规律的理解应该不难,但是这里需要提醒一下,第三条判别方法还需要加上边的方向判别:

所有其余的情况。这些情况下,pipj合法当且仅当min(k, l) < min(i, j),并且pipj需在非负顶点构成的多边形的内部。

这个是什么意思呢?大家先来看看下面的图例:

在这里插入图片描述

大家可以注意到,当pipj非法时,它们总是位于p0p1p2所构成的多边形的内部,这点大家想想也能明白,p-1p-2所参与构成的边在最后阶段都会被移除,那么它们必然不能处在Delaunay Triangulation的内部。

到此我们扫清了无限点的概念,那么现在可能还剩最后一个问题:在具体的实例当中,我们应当如何理解它们呢?之前我们只是抽象地描述了它们的性质,接下来我通过一个具体的例子来为大家展示无限点具体的表现形式。其实大家可以把无限点参与构成的边想象成可以任意弯曲的曲线,而不是真正的直线,它们只需要“包裹”住所有输入点即可。这样就能很好地理解它们的作用了,下面给到的例子同样包含三角点定位的搜索结构:
在这里插入图片描述

最后当插入一个点,所需要拆分的三角形有两种情况1
在这里插入图片描述

但对于无限点(p-1或p-2),我们是否都需要考虑上述两种情况呢?答案是否定的,为了简化问题难度和实现难度,我们规定:

任意点都落在三角形的内部,如果这个三角形是由无限点(p-1或p-2)参与构成的。

本来无限点就是概念点,所形成的边也是概念边,我们无需为其单独考虑,而且避免其落在边上,也简化了问题难度,因为当插入点落在边上,我们需要拆分两个三角形,但落在内部只需要拆分一个。到此,我们讲解完了无限点的相关的内容。

3. 伪代码

// 主入口算法
Algorithm DELAUNAYTRIANGULATION(P)
算法 DELAUNAYTRIANGULATION(P)
Input. A set P of n+1 points in the plane.
输入:由平面上 n+1 个点组成的一个集合 P
Output. A Delaunay triangulation of P.
输出:P 的一个 Delaunay 三角剖分
1. Let p0 be the lexicographically highest point of P, that is, the rightmost among the points with largest y-coordinate.
1. 令 p0为 P 中依字典序最高的点,亦即,y-坐标最大的多个点中最靠右的那个
2. Let p-1 and p-2 be two points in R2 sufficiently far away and such that P is contained in the triangle p0p-1p-2.
2. 在 R2中选取相距足够远的点 p-1和 p-2,将 P 完全包含于三角形 p0p-1p-2之中
3. Initialize T as the triangulation consisting of the single triangle p0p-1p-2.
3.T 初始化为单独的一个三角形 p0p-1p-2
4. Compute a random permutation p1, p2,..., pn of P \ {p0}.
4. 随机地选取 P\{p0}中各点的一个次序:p1, ... , pn
5. for r <- 1 to n
5. for r <- 1 to n
	6. do (* Insert pr into T: *)
	6. do (* 将 pr插入到 T*)
		7. Find a triangle pipj pk ∈ T containing pr.
		7. 找到 pr所在的三角形 pipjpk ∈ T
		8. if pr lies in the interior of the triangle pipjpk
		8. if (pr落在三角形 pipjpk的内部)
			9. then Add edges from pr to the three vertices of pipjpk, thereby splitting pipjpk into three triangles.
			9. then 分别将 pr与三角形 pipjpk的三个顶点联接起来 (* 生成三条边,从而将三角形 pipjpk一分为三 *)
				10. LEGALIZEEDGE(pr, pipj, T)
				10. LEGALIZEEDGE(pr, pipj, T)
				11. LEGALIZEEDGE(pr, pjpk, T)
				11. LEGALIZEEDGE(pr, pjpk, T)
				12. LEGALIZEEDGE(pr, pkpi, T)
				12. LEGALIZEEDGE(pr, pkpi, T)
			13. else (* pr lies on an edge of pipjpk, say the edge pipj *)
			13. else (* pr正好落在三角形 pipjpk的某一条边(不妨设为pipj)上)
				14. Add edges from pr to pk and to the third vertex pl of the other triangle that is incident to pipj, thereby splitting the two triangles incident to pipj into four triangles.
				14. 将 pr分别与 pk以及与pipj关联的另一三角形的第三个顶点 pl 联接起来(* 从而将与pipj相关联的那两个三角形划分成四个三角形 *)
				15. LEGALIZEEDGE(pr, pipl, T)
				15. LEGALIZEEDGE(pr, pipl, T)
				16. LEGALIZEEDGE(pr, plpj, T)
				16. LEGALIZEEDGE(pr, plpj, T)
				17. LEGALIZEEDGE(pr, pjpk, T)
				17. LEGALIZEEDGE(pr, pjpk, T)
				18. LEGALIZEEDGE(pr, pkpi, T)
				18. LEGALIZEEDGE(pr, pkpi, T)
19. Discard p-1 and p-2 with all their incident edges from T.
19. 将点 p-1、p-2以及与之关联的所有边从 T 中剔除掉
20. return T
20. return (T)
// 边翻转算法
LEGALIZEEDGE(pr, pipj,T)
算法 LEGALIZEEDGE(pr, pipj, T)
1. (* The point being inserted is pr, and pipj is the edge of T that may need to be flipped. *)
1. (* pr为插入的点,pipj为 T 中可能需要翻转的一条边 *)
2. if pipj is illegal
2. if (pipj是非法的)
	3. then Let pipjpk be the triangle adjacent to pr pipj along pipj.
	3. then 令 pipjpk为沿着边pipj与 prpipj相邻的三角形
		4. (* Flip pipj: *) Replace pipj with prpk.
		4. 将原来的边pipj替换成边prpk (* 翻转pipj *)
		5. LEGALIZEEDGE(pr, pipk, T)
		5. LEGALIZEEDGE(pr, pipk, T)
		6. LEGALIZEEDGE(pr, pkpj, T)
		6. LEGALIZEEDGE(pr, pkpj, T)

4. 可视化结果示例

这里给到了以塞尔达野炊所有传送点为输入点的Delaunay Triangulation,和其Voronoi对偶图:

在这里插入图片描述

5. 项目代码

个人作业项目代码:Algorithm

DescriptionEntry method\File
Build Delaunay TriangulationFace delaunayTriangulation( List<Vertex> P )
Find a triangle piPjPk ∈ T containing pr.DelaunayVertex get( Vector pr )
Program ( including visualization )CG2017 PA3-1 Delaunay Triangulation

6. 拓展(Follow-ups)

  • Voronoi Diagrams和Delaunay Triangulation的相互转化,两者互为对方的对偶图
  • 随机算法的框架,详见教材 9.5 * 随机算法框架 (9.5* A Framework for Randomized Algorithms)

上一节:CG2017 PA1-2 Crossroad (十字路口)

下一节:CG2017 PA3-2 Which wall are you looking at (你在看哪面墙)

系列汇总:清华计算几何大作业思路分析和代码实现

7. 参考资料

  1. Computational Geometry: Algorithms and Applications
  2. 计算几何 ⎯⎯ 算法与应用, 邓俊辉译,清华大学出版社
  3. 计算几何 | Computational Geometry

8. 免责声明

※ 本文之中如有错误和不准确的地方,欢迎大家指正哒~

※ 此项目仅用于学习交流,请不要用于任何形式的商用用途,谢谢呢;


在这里插入图片描述


  1. 计算几何 ⎯⎯ 算法与应用, 邓俊辉译,清华大学出版社 ↩︎ ↩︎ ↩︎

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值