作者:henu_wxj
链接:https://blog.nowcoder.net/n/6a9e1dc2a32b401cae26dcbcf509eb96
来源:牛客网
写在前面---
现在我们学习凸包的有关算法(终于开始凸包的学习了)。也算是初步接触计算几何了。
凸包的概念是在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包,表示为:
![1e03ebfab4f56fea706bdc05c60949d1.png](https://i-blog.csdnimg.cn/blog_migrate/2d98cc2a371ac85bfbb43ab7a78a9066.png)
在二维空间中,凸包也可以形象的理解为最小的包含所有点的凸多边形。
X的凸包可以用X=(x1,x2,x3,...,x12)的线性组合来构造,即:
![2e79acbf53c76b267009e4fdfb642f6e.png](https://i-blog.csdnimg.cn/blog_migrate/c59f9e0051d413402fc1ae1191a5ab63.png)
在计算几何中,凸包问题是一类比较常见的问题,不仅在计算机程序设计竞赛中,在统计等现实问题中也有着广泛的应用。
现在已经证明了凸包算法的时间复杂度下界是
![equation?tex=O%28n%5Ctimes+logn%29](https://i-blog.csdnimg.cn/blog_migrate/fba716e8f49cd80bd66cc25cc8848476.png)
![equation?tex=O%28n%5Ctimes+logh%29](https://i-blog.csdnimg.cn/blog_migrate/093b6e2483b13805c74b1c8edbe64be4.png)
卷包裹法
原理:
卷包裹法的原理比较简单:先找一个最边缘的点(一般位于最下方,如果有多个点,则选择最左方的点),假设有一条绳子,以该点为端点向右边逆时针旋转直到碰到另一个点为止,此时找出凸包的一条边;然后再用新找到的点作为端点,继续旋转绳子,找到下一个端点;重复这一步骤直至围成一个凸多边形,即可得到这个点集的凸包。卷包裹法的时间复杂度为
![equation?tex=O%28N%5E2%29](https://i-blog.csdnimg.cn/blog_migrate/936564da94cf030107440f6d9841ab87.png)
步骤:
Step1:选择点集中最下面的点,如果有多个,则选择最下面的点中最左边的一个,所选择的点是凸包的第一个点。
Step2:以水平向右的方向作为初始射线方向,逆时针旋转,选择第一条在初始射线之上的射线作为当前射线,当前射线经过凸包的第二个点。
Step3:以当前射线为基准,继续逆时针旋转找到最靠近该射线的一条射线,从而找到凸包的另一个点。把这条射线作为当前射线,这个过程一直继续,直至回到第一个点。