跳到主要内容

旋转卡壳 (Rotating Calipers)

旋转卡壳(Rotating Calipers)是由 Michael Shamos 提出的一种在凸多边形上进行线性扫描的高效算法。它的核心在于利用凸多边形的拓扑单调性,通过两根(或多根)平行支撑线的旋转,在 O(N)O(N) 时间内解决直径、宽度、外接矩形等问题。


1. 对踵点拓扑单调性证明

对踵点 (Antipodal Pairs) 的性质

定义:若凸多边形 HH 存在两条平行支撑线分别过点 PPQQ,则 (P,Q)(P, Q) 称为一对对踵点。

证明:距离函数的单峰性 (Unimodality) 命题:固定凸多边形的一条边 ei=ViVi+1e_i = V_iV_{i+1},顶点 VjV_j 到直线 ViVi+1V_iV_{i+1} 的垂直距离 h(j)h(j) 是关于 jj 的单峰函数。 证明

  1. f(j)=ViVi+1×ViVjf(j) = \vec{V_iV_{i+1}} \times \vec{V_iV_j}。由叉积定义,f(j)|f(j)| 与距离 h(j)h(j) 成正比。
  2. 由于 HH 是凸多边形,其内角均 π\le \pi。当 jj 在边界上移动时,向量 VjVj+1\vec{V_jV_{j+1}} 的极角单调变化。
  3. 考虑 f(j+1)f(j)=ViVi+1×VjVj+1f(j+1) - f(j) = \vec{V_iV_{i+1}} \times \vec{V_jV_{j+1}}
  4. 由于凸性,该差值符号在绕行一周的过程中至多改变两次(对应极大值和极小值)。
  5. 故在固定底边的情况下,最远点(对踵点)随底边的逆时针旋转也呈逆时针单调移动。

2. 数值鲁棒性分析 (Numerical Robustness)

旋转卡壳对“平行”和“共线”高度敏感。

平行边与退化判定
  1. 最大面积判定:在更新对踵点指针 jj 时,比较 area(i, i+1, j)area(i, i+1, j+1)
    • 逻辑一致性:必须使用 sign(area_next - area_curr) >= 0 而非 > 0,以确保在存在平行边时,指针能遍历到所有对踵点。
  2. 距离计算:尽量避免直接计算垂直距离(涉及除法和开方),优先使用叉积进行大小比较。

3. 教材级经典推导与练习库 (Exercises)

例题 1:最小外接矩形 - 三指针一致性校验

题目描述:求覆盖凸多边形的最小面积矩形。 推导: 最小矩形的一条边必然与凸多边形的一条边 eie_i 重合。 我们需要维护三个极值点:

  1. 最高点 pp:到 eie_i 距离最大(由叉积维护)。
  2. 最右点 rr:在 eie_i 方向上的投影最大(由点积维护)。
  3. 最左点 ll:在 eie_i 方向上的投影最小(由点积维护)。
Check Solution
练习 1:两个凸包的最小距离

题目描述:求两个不相交凸包 A,BA, B 的最短距离。 思路

  1. 使用两组卡壳平行线。当 AA 的支撑线与 BB 的支撑线平行且反向时,距离取得局部极小。
  2. 距离可能由点-点、点-边或边-边产生。
Check Solution

提示:对两个凸包分别寻找 yy 最小和 yy 最大的点作为起始指针,进行同步旋转。比较四种组合下的最小距离。

练习 2:多边形宽度 (Width of Polygon)

题目描述:凸多边形的宽度是其两条平行支撑线之间的最小距离。 推导:宽度必由一条边 eie_i 及其对应的对踵点 PP 产生。即 W=minidist(P,Line(ei))W = \min_i \text{dist}(P, \text{Line}(e_i))

Check Solution

🎯 模块导航