CG2017 PA2-2 Find Dancing Partners (寻找舞伴)· 上
1. 前置知识
- 计算几何算法:Voronoi Diagrams,详见教材 Voronoi图:邮局问题(7 Voronoi Diagrams: The Post Office Problem)
- DCEL
- In Circle Test
这里给到必要观看的视频课程章节,这些内容对理解和实现 Voronoi Diagrams 算法至关重要,标记有绿色√为必看章节:
2. 思路分析(Voronoi Diagrams)
问题描述:CG2017 PA2-2 Find Dancing Partners (寻找舞伴)
这个作业属于最高难度一档,Voronoi Diagrams算法本身难理解,而且从这个算法开始,需要多个算法进行结合才能最终解决问题,因此大家需要有一定的心理准备哒~
根据题目的提示,这道题有两种解题方法:
1)一种办法是以男孩位置为输入,建立Voronoi图,在这个Voronoi图基础上对女孩的位置进行Point Location算法确定其最近的男孩。
2)另一种办法是对舞池划分网格,每次为女孩所在网格的临近网格中搜索男孩。
因为为了结合我们学习的内容,这里我们主要介绍第一种解题方法,第二种大家有时间可以自己思考一下呢,所以本题涉及两个的计算几何算法:1)Voronoi Diagrams 和 2)Point Location,而且Voronoi Diagrams的算法理解难度是整个课程里面最难的,因为这是唯一一个使用曲线进行计算的算法,而其他算法都是使用直线进行计算。所以对于Voronoi Diagrams算法本身,推荐大家好好理解邓老师在edX上面的视频课程,也可以参考我写的系列文章:Voronoi图(一):塞尔达背后的计算几何(更新中…),所以这篇文章我们还是把焦点放在实现层面,而不是算法理解层面上。
2.1.1 BBST中的圆事件
第一个我们需要讲解的实现细节既是Circle Event的BBST中存储结构。首先我们需要想起Circle Event的特点:
1)同一个Circle Event同时存在于Event Queue 和 Status Tree中;同一Circle Event被删除时,则被同时从Event Queue 和 Status Tree被移除;
2)在Status Tree中,Circle Event仅存放在叶节点之中,既存放在表示Voronoi Site的节点中,不会存在放表示抛物线交点的中间节点之中;
3)在处理基点事件(Site Event)算法中,可能会从Event Queue中删除叶结点(Status Tree中)存放的Circle Event;同样地,在处理圆事件(Circle Event)算法中,假设当前圆事件表示即将消失的Arc为 γ,那么也需要从Status Tree中删除与γ相关联的圆事件,且这些圆事件存在于γ所在叶结点的前继或后继叶结点之中;所以Event Queue 和 Status Tree 中的圆事件需要相互指向对方,方便在O(1)时间完成上述删除操作;(吐槽:如果你对于本段描述看得云里雾里,那说明没有完全理解Voronoi构造算法,需要回炉重造哒~)
4)基于3),我们需要在Status Tree的叶结点中不仅要存放该叶结点涉及的圆事件,还要存储相关联的前继或后继圆事件的叶结点,用来完成3)中描述的操作;
对于这些特点,笔者我就用一个实际的图例来给大家讲解,方便大家理解:
通过上面的例子,我们可以得到下面Circle Event在 Status Tree 中的存储数据结构:
上面的图例请务必大家理解到位哒,后面的讲解都用到哦。
2.1.2 Voronoi Vertex
在上面圆事件讲解中,我们其实忽略了两个细节:1)当一个Voronoi Vertex创建时,我们同时还需要构造对应的DCEL结构,2)把计算得到的Voronoi Diagrams链接到Bounding Box。那么接下来我们就来讲解如何进行Voronoi Vertex的DCEL结构的构建。
一般情况下,Voronoi Vertex的出度(或入度)为3,所涉及的Half-edges的数目就是恒定的6条,而且我们在生成Half-edges时候,做出如下规定:
Status Tree的中间节点<i,j>默认存储朝向i的Half-edge。
比如当插入Site 3,会生成 e3 和 e4,因此<1,3>存储e3,因为Site 3在e3的左边,< 3,1 >存储e4,因为Site 4在e4的左边。那么可以用下图来描述如何进行Voronoi Vertex的DCEL构造:
对于多点共圆所生成的Voronoi Vertex,我们单独留到后续章节在进行讲解,这里大家先理解一般情况下如何构造Voronoi Vertex的DCEL结构。
下一节我们将继续讲解如何将生成的Voronoi Diagrams链接到一个Bounding Box上面,因为之前我们生成的Voronoi会包含无限延长的半边(Infinite Half–edges),这是不利于实际工程应用的,我们需要Bounding Box来消除它们。
上一节:CG2017 PA4-2 Orthogonal Windowing Query (正交矩形窗口查询)
下一节:CG2017 PA2-2 Find Dancing Partners (寻找舞伴) · 中
系列汇总:清华计算几何大作业思路分析和代码实现
3. 参考资料
- Computational Geometry: Algorithms and Applications
- 计算几何 ⎯⎯ 算法与应用, 邓俊辉译,清华大学出版社
- 计算几何 | Computational Geometry
4. 免责声明
※ 本文之中如有错误和不准确的地方,欢迎大家指正哒~
※ 此项目仅用于学习交流,请不要用于任何形式的商用用途,谢谢呢;