M. Plane-Sweep

官官方数学老师·16 页·深入(追求细节与边界)·1 次浏览·32 天前
数学大学

M. Plane-Sweep

计算几何 · 04. Voronoi Diagram

按 空格/→ 演示下一步

问一句
1 / 16 页

全部页面点击任意一页,跳回舞台从这页播放

数学大学

M. Plane-Sweep

计算几何 · 04. Voronoi Diagram

1第 1 页 · M. Plane-Sweep

A First Glance

Fortune 扫描线算法一览:扫描线自上而下推进,海滩线记录当前最近边界。

两大组件
海滩线(状态)与事件队列(驱动)
成果
O(n log n) 构造 Voronoi 图
2第 2 页 · A First Glance

Backtracking

为什么朴素直接法会走回头路:早期决策可能被后续站点推翻。

决策失效
先确定的边可能被新站点大面积覆盖
Fortune 的回应
用「冻结区域」屏蔽不确定部分
3第 3 页 · Backtracking

Fortune's Trick

Fortune 的魔法:把站点向上「膨胀」一个与扫描线等距的量,遮挡未定区域。

变形距离
新距离使扫描线以上的站点同倍膨胀
效果
膨胀后的最近边界就是安全的最终答案前缀
4第 4 页 · Fortune's Trick

Frozen Region

冻结区域:扫描线以上、海滩线以下的部分——其内部形状尚未定局。

位置
位于扫描线上方与海滩线之间的楔形区
不给答案
冻结区内的真实边界留待后续事件揭示
5第 5 页 · Frozen Region

Beach Line

海滩线:各站点抛物线(焦点在站点、准线是扫描线)的下包络线。

抛物线弧
每段弧对应一个「当前最近」的站点
弧数
最多 2n−1 段,随事件增减
6第 6 页 · Beach Line

Lower Envelope

海滩线是抛物线族的下包络:任一 x 处取最低的弧。

包络
下包络决定每列 x 的最近站点归属
变化
断点沿抛物线交点轨迹移动
7第 7 页 · Lower Envelope

Break Points

断点:相邻两弧的交点,恰好落在某对站点的平分线上。

断点即边
断点的轨迹就是 Voronoi 边
追踪
算法维护断点的当前位置与速度
8第 8 页 · Break Points

Events

驱动扫描的两类事件:站点事件与圆事件,各有确定的产生与消失时机。

站点事件
扫描线触到新站点时发生
圆事件
某段弧缩为一点时发生
9第 9 页 · Events

Circle Event: What, When

圆事件三问:什么(弧消失)、何时(外接圆最低点被扫到)、何地(外接圆最低点处)。

何地
位置 = 三站点外接圆的最低点
何时
扫描线到达该最低点纵坐标时
10第 10 页 · Circle Event: What, When

Circle Event: Why

为什么弧会消失:相邻两弧的断点追上了本弧与另一侧的断点。

夹缩
两侧断点相向移动,中间弧被夹没
合法性
只有当前真实存在于海滩线的弧才注册圆事件
11第 11 页 · Circle Event: Why

Circle Event: How

圆事件的实现:三弧组合注册、失效即删除——优先队列管理。

注册
三相邻弧(不同站点)产生一个候选圆事件
失效
弧被消耗或分裂后事件作废,用标记判废
12第 12 页 · Circle Event: How

Site Event: What

站点事件:扫描线到达一个新站点,海滩线上长出一株新抛物线弧。

必然事件
每个站点恰好产生一个站点事件
效果
新弧把某段旧弧一分为二
13第 13 页 · Site Event: What

Site Event: How

站点事件的处理:定位新弧所在弧段、分裂、注册新的潜在圆事件。

定位
在海滩线上找到正对新站点 x 的弧
分裂与注册
旧弧裂成两半夹新弧,检查新增的三弧组合
14第 14 页 · Site Event: How

本节要点

  • ✓Fortune 技巧:膨胀遮挡未定区域
  • ✓海滩线 = 抛物线下包络,断点轨迹即边
  • ✓站点事件长弧,圆事件消弧
  • ✓优先队列 + 平衡树 = O(n log n)
延伸主题:实现 Fortune 算法骨架用小数据集走查事件序列
15第 15 页 · 本节要点

课后思考

先自己回答,再展开参考答案——能讲出来才算真懂。

1Fortune 技巧「膨胀站点」的几何本质是什么?

参考答案把欧氏距离换成「到站点与到扫描线的距离之差」:扫描线以下的部分因未确定而不参与比较,海滩线恰是两种距离相等的点的轨迹。变形让「不确定」自动被遮挡,算法不需要回溯。

2圆事件为什么只在「三弧相邻」时才注册?

参考答案弧消失的原因是两侧断点相遇夹缩,而断点只存在于相邻弧之间。三弧相邻才能形成「两侧夹中间」的收缩结构;不相邻的弧组合对应的圆内必有其他站点,不是空圆。

3Fortune 算法为什么能达到 O(n log n)?

参考答案事件总数 O(n)(n 个站点事件 + O(n) 个圆事件),每个事件的处理涉及平衡树定位与优先队列操作,均为 O(log n);断点轨迹总长(即输出边长)线性。三者合计 O(n log n)。

16第 16 页 · 课后思考