Graham Scan凸包算法

Graham Scan算法是一种二维凸包算法,能在O(nlogn)时间内找到凸包。首先,通过对点按x坐标(当x相同时比较y坐标)进行排序来确定起点。然后,构建一个数组存储可能构成凸包的点的下标。从起点开始,检查每个点,如果新点与已存储点形成的“壳”保持凸性,则将其添加到数组;否则,删除最后一个点并重新检查,直到凸性恢复。通过判断向量的交叉乘积判断点是否在凸包上。算法分为扫描上、下壳两部分,最终合并得到凸包。
摘要由CSDN通过智能技术生成
一:什么是凸包

这里写图片描述
在一个二维坐标系中,有若干点杂乱排列着,将最外层的点连接起来构成的凸多边型,它能包含给定的所有的点,这个多边形就是凸包。
寻找凸包的算法有很多种,Graham Scan 算法是一种十分简单高效的二维凸包算法,能够在 O(nlogn) 的时间内找到凸包。

二:Graham Scan 算法
  1. 先将若干个点排序比较两个点的 x 坐标小的先被扫描。如果两个点 x 坐标相同,那么就比较 y 坐标,小的先被扫描(扫描上凸壳的时候反过来)。
  2. 我们可以定义一个数组que[]用来存储可以构成凸包的点的下标。
  3. 先确定一个起点(一般是最左边的点和最右边的点),并将他的下标存入que数组中
  4. 接着看下一个点 如果加入这个点和que数组中之已存入的最后一点所构成的 “壳” 凸性没有变化,就将他存入que数组中。
    否则就把que数组中之已存入的最后一点删去,再比较凸性,直到凸性不发生变化。
  5. 分别扫描上下两个 “壳”,合并在一起,凸包就找到了。
  6. 对于二维向量a=(x1,y2)和b=(x2,y2),a×b定义为x1*y2-y1*x2。而它的几何意义就是|a||b|sin<a,b>。如果a与b夹角小于180度(逆时针&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值