F. Triangulating Monotone Polygons

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

F. Triangulating Monoton

计算几何 · 03. Triangulation

按 空格/→ 演示下一步

问一句
1 / 12 页

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

数学大学

F. Triangulating Monoton

计算几何 · 03. Triangulation

1第 1 页 · F. Triangulating Monoton

Monotone Polygon

单调多边形:存在一个方向,任何与该方向垂直的直线与边界至多交两点。

单调方向
通常取 y 轴方向作为单调方向
意义
单调多边形可在线性时间三角化
2第 2 页 · Monotone Polygon

Monotonicity Testing

单调性测试:沿边界行进,区分左链与右链,检查是否始终单调。

双链
从最高点到最低点分出左链与右链
判定
每条链自身 y 坐标单调即可
3第 3 页 · Monotonicity Testing

Strategy

三角化策略:顶点按 y 降序入队,逐个与对侧链的顶点连接对角线。

队列
维护已处理顶点的凸序列
分情形
同侧与异侧的处理规则不同
4第 4 页 · Strategy

Stack-Chain Consistency

栈链一致性:栈内顶点始终保持为同一条链上的一段凸链。

不变式
栈序列是左链或右链的凸子链
作用
保证对角线都在多边形内部
5第 5 页 · Stack-Chain Consistency

Same Side + Reflex

新顶点与栈顶同链且为凹点:不连对角线,只把新点压栈。

压栈
凹点保留,等待后续与对侧连接
条件
判断新点相对栈顶两点的转向
6第 6 页 · Same Side + Reflex

Same Side + Convex

新顶点与栈顶同链且为凸点:连续弹栈连对角线,再把新点压栈。

弹栈连对角线
每弹一个顶点连一条对角线
止于
弹到栈中仅剩一个顶点或转为凹为止
7第 7 页 · Same Side + Convex

Opposite Side

新顶点来自另一条链:直接与栈中全部顶点连对角线。

全连
异侧时栈内所有顶点都可见
清栈
连完后弹空,压入新点
8第 8 页 · Opposite Side

Example

单调三角化完整例题:从剖分前的单调多边形出发逐步连出全部对角线。

走查
逐顶点演示压栈弹栈与对角线连接
图形验证
对角线互不交叉且覆盖整个多边形
9第 9 页 · Example

Analysis

复杂度分析:每个顶点压栈一次弹栈至多一次,扫描线性。

压栈
n 个顶点各压栈一次
弹栈摊还
弹栈总数不超过压栈总数,总 O(n)
10第 10 页 · Analysis

本节要点

  • ✓单调多边形可 O(n) 三角化
  • ✓栈链不变式保证对角线合法
  • ✓同链分凹凸、异链全连三种情形
延伸主题:实现单调三角化对比切耳法与单调法的效率
11第 11 页 · 本节要点

课后思考

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

1为什么单调多边形可以线性时间三角化,一般多边形却需要 O(n log n)?

参考答案单调性使顶点天然分成左右两条有序链,扫描一次即能确定全部对角线。一般多边形需先单调化(切出凹点、加对角线),这一预处理本身要 O(n log n)。

2同链凸点连续弹栈为什么不会连出越界对角线?

参考答案栈链是凸链且新点在同侧的更远处:凸链上任何顶点与新点的连线都落在多边形内部(单调区域内的可视性由凸性保证)。这正是栈链不变式存在的意义。

3单调化过程中「劈开凹点」加的对角线算进三角剖分吗?

参考答案算。单调化加的对角线与后续三角化的对角线合在一起构成完整剖分,两部分都不交叉。复杂度分析也因此分两段:单调化 O(n log n) 加三角化 O(n)。

12第 12 页 · 课后思考