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