“凸包边界上的站点对应Voronoi 图的无界 cell,Delaunay 三角剖分覆盖同一凸包。对非空有限点集的凸包,线性目标总能在某个极点取得最优;旋转卡壳还可在极点循环序列上求最远点对。…”
形式陈述
固定实平面的标准 Euclidean 内积。已知一个凸多边形的逆时针极点序列
而不枚举全部顶点对?最大值可在顶点对取得:固定一个点,距离作为另一变量的凸函数,在有限凸组合上不超过某个顶点的距离;两边依次换成顶点即可。因此对任意有限点集,先求其凸包,再对极点序列计算直径。
称两个顶点为对踵点,如果存在两条平行支撑线分别经过它们,并把多边形夹在中间。任意最远点对都是对踵点:垂直于连线的两个支撑方向必须在这两端达到极值,否则还有一点在该方向上更远,从而 Euclidean 距离也更大。
对每条有向边
它是三角形有向面积的两倍。先令
直觉
两条平行尺贴在凸多边形外面。旋转它们时,接触点沿边界按同一个方向走,不会倒退。一个支撑方向在一条边的法向处发生事件;此刻至少一把尺贴住整条边,另一把尺落在一个顶点或另一条平行边上。
所有需要考虑的对踵顶点对都出现在这些接触变化附近。因此每条边只需要看它对面的最高点,并把边的两个端点都纳入距离比较。最高点最大化的是到直线的垂距,不是到某个固定端点的距离,所以最后这一步不能省略。
例子与边界
取逆时针六边形
分别编号
这里
第一条边
其余边事件都没有超过
矩形体现平局边界。一条边的对面也是一整条平行边,两个对面端点等高,真正的直径却是对角线。如果算法在等高时只比较任意一个端点组合,可能漏掉另一条最大对角线,甚至因候选实现不完整而漏掉最大值。实现要么显式枚举平行边的四种端点配对,要么证明其等价平局处理覆盖这些候选。
输入若有连续共线点,先压成真正极点可简化支撑接触;若还要返回所有达到最大值的原输入索引,再用保留的边界映射恢复。全共线点集的凸包是一条线段,答案直接是两端距离;单点和空集应有自己的接口,不能硬进入循环卡壳。
推论与应用
凸性使对面接触单调前进。按上述首边初始化后,初始化和整圈推进合计不超过常数倍
若原输入是
最近点对依靠局部稀疏条带,而直径由凸包边界与全局支撑控制。旋转卡壳也可用于宽度或最小包围矩形,但目标函数和需要同步的支撑线数量会改变;“都能旋转”不是这些算法共享同一候选公式的理由。
参考资料
- Godfried T. Toussaint,Solving Geometric Problems with the Rotating Calipers,MELECON 1983,支撑事件、对踵点及线性推进框架。
- Toussaint,作者的 Rotating Calipers 说明,说明直径算法的 Shamos 来源与后续推广。