本系列文章力求以简洁易懂的文字介绍计算几何中的基本概念,使读者快速入门,故不追求难度和深度,仅起到抛砖引玉的作用。
不知不觉基础的计算几何就快讲完了,这次我再讲讲有关多边形以及凸包的各种小算法。(QAQ)
1.旋转卡壳算法
看到这个算法的时候第一反应是脑子卡壳叭,尤其是我们在做这道家喻户晓的模板题的时候:
[USACO03FALL] Beauty Contest G /【模板】旋转卡壳 - 洛谷
旋转卡壳算法是用来干啥的呢?
我们将一个多边形上任意两点间的距离的最大值定义为多边形的直径,那么我们如果直接枚举直径所在的两点, 显然太慢了。那么有一个O(n)的算法:旋转卡壳,计算时就像一对平行卡壳卡住凸包旋转而得名,可以说这个名字取得非常的形象,那么我们来看一下这道题目的思路历程:
先抛出一个问题:
在二维平面上给定n个点,求距离最远的两个点之间的距离是多少?
看到这道题,大部分同学第一反应肯定是暴力——暴力枚举所有点对,然后求出最远的那一对相距的距离。这种方法当然没错,可是复杂度已经达到了O(n^2),当n是50000,100000,甚至1000000时,暴力就显得苍白无力。
这时我们进一步思考,这个最远点对一定会出现在这些点集的凸包上,所以在这里我们在凸包上,使用复杂度低至O(n)的旋转卡壳算法进行求解。

什么是平行卡壳?非常形象的说法就是卡住凸包的一对平行线,然后旋转卡壳就是让这对平行线旋转起来:

本文介绍了计算几何中的旋转卡壳算法,用于求解多边形直径、凸多边形宽度和最小/最大距离等问题,通过GrahamScan求凸包并利用叉积和单峰函数性质优化效率。



610

被折叠的 条评论
为什么被折叠?



