清华计算几何大作业(八):CG2017 PA2-2 Find Dancing Partners (寻找舞伴) · 上 | Voronoi Diagrams 构造实现讲解

1. 前置知识

  1. 计算几何算法:Voronoi Diagrams,详见教材 Voronoi图:邮局问题(7 Voronoi Diagrams: The Post Office Problem)
  2. DCEL
  3. 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. 参考资料

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

4. 免责声明

※ 本文之中如有错误和不准确的地方,欢迎大家指正哒~
※ 此项目仅用于学习交流,请不要用于任何形式的商用用途,谢谢呢;


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值