Graham-Scan算法是一种灵活的凸包算法,时间复杂度是O(nlogn)
算法细节:
1. 选出最左下角的点(排序:x最小,其次是y最小)
2. 其余点按极角排序,在极角相等的情况下距离极点(p[0])最近的优先
3. 用一个栈(数组)存储凸包上的点,先把p[0],p[1]压入栈。
4. 扫描每一个点,用叉积判断新点和栈顶头两个点形成的拐向。顺时针就弹出栈顶元素,继续判断。否则压入新点p[i]
(判断的前提是栈内已经压入了两个点)
5. 最终栈内元素就是凸包点。
附图说明(接下来看图,用心感受):