最初接触旋转卡壳(应该读xuán zhuǎn qiǎ ké)是在CSU上的一道题(这道题至今没A,也不知道是是吗玄学操作,更新:AC了,输出记得用%f),不过这不重要,重要是学到了新知识!
一些历史
1978年, M.I. Shamos’s Ph.D. 的论文”Computational Geometry”标志着计算机科学的这一领域的诞生。 当时他发表成果的是一个寻找凸多边形直径的一个非常简单的算法, 即根据多边形的一对点距离的最大值来确定。
后来直径演化为由一对对踵点对来确定。 Shamos提出了一个简单的 O(n) 时间的算法来确定一个凸 n 角形的对踵点对。 因为他们最多只有 3n/2 对, 直径可以在 O(n) 时间内算出。
如同Toussaint后来提出的, Shamos的算法就像绕着多边形旋转一对卡壳。 因此就有了术语“旋转卡壳”。 1983年, Toussaint发表了一篇论文, 其中用同样的技术来解决许多问题。 从此, 基于此模型的新算法就确立了, 解决了许多问题。
他们包括:
计算距离
凸多边形直径
凸多边形宽
凸多边形间最大距离
凸多边形间最小距离
外接矩形
最小面积外接矩形
最小周长外接矩形
三角剖分
洋葱三角剖分
螺旋三角剖分
四边形剖分
凸多边形属性
合并凸包
找共切线
凸多边形交
临界切线
凸多边形矢量和
最薄截面
最薄横截带
然后就讲一下旋转卡壳算法思想:重点内容
简单来说就是用一对平行线“卡”住凸包进行旋转。
被一对卡壳正好卡住的对应点对称为对踵点(如下图)
可以证明对踵点的个数不超过3N/2个 也就是说对踵点的个数是O(N)的
对踵点的个数也是我们下面解决问题时间复杂度的保证
有两种卡壳情况:
一、两个平行线正好卡着两个点
二、分别卡着一条边和一个点