凸包与Graham扫描法求凸包

前置芝士

凸多边形

凸多边形指的是所有内角都在 ( 0 , π ] (0,\pi] (0,π] 范围内的多边形。

凸包

对于一个平面上的一个给定的点集,他们对应的凸包就是能把他们全部包含的最小凸多边形。

如果形象一点,可以把平面上的点集想象成木板上的钉子,而其对应的凸包则是一根将所有点围在内部的橡皮筋。

cunvhull1.png

凸包求法

常用的凸包求法有Graham扫描法和Andrew算法,这里主要讲解Graham扫描法,Andrew算法可以看OI-Wiki对应内容。

复杂度

Graham扫描法的时间复杂度是 O ( n log ⁡ n ) O(n \log n) O(nlogn),瓶颈主要在对所有点的极角排序上。

过程

选取基准点

首先我们选择一个点来当做我们的基准点。
这个点需要在整个点集的最下方,而如果有多个纵坐标相同的点我们选横坐标最小的点,所以我们直接 O ( n ) O(n) O(n) 扫一遍即可。

极角排序

然后把剩下的点以刚才我们选出的点为基准进行极角排序。
因为这个点的左下方没有点,那么任意一个点的极角只能在 ( 0 , π ] (0,\pi] (0,π] 范围内。
会的可以跳过。

下面将我们目前需要比较的两个点称作 P i P_i Pi P j P_j Pj,将基准点称为 P 0 P_0 P0

我们可以选择两种方法来进行排序。

首先是一种比较浅显的,通过极角的余弦值的相反数来排序。
通过观察,我们可以发现在 ( 0 , π ] (0,\pi] (0,π] 范围内,函数 f ( x ) = − cos ⁡ ( x ) f(x)=-\cos(x) f(x)=cos(x) 是单调递增的。
所以我们如果知道了 − cos ⁡ ( ∠ P i P 0 x ) < − cos ⁡ ( ∠ P j P 0 x ) -\cos(\angle P_i P_0 x) < -\cos(\angle P_j P_0 x) cos(PiP0x)<cos(P

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值