凸包(convex hull)
凸包是指对于平面上给定的一些点,选取一个最小的凸多边形使得这些点或者在其内部,或者在其边上。
求凸包的Graham扫描法
针对一个有三个或以上点的点集Q
基本算法:
1. 已知各点坐标,将他们放入一个二维坐标系
2. 算出各点极角,按降序排序 , 取最小点做起点
3. 三点扫描一次:
if 对于不符合的点删除,然后继续扫描当前三点
else 符合的点就找下一个点继续,直到扫描了所有的点
代码分析:
1. 建立一个点结构体point, 包括x,y坐标,和angle表示极角
2. 考虑到要排序,将初始的点用multiset 保存
3. 保存处理的点用deque(有的方法是用stack,因为操作中有类似出栈入栈的操作。但是判断点的过程是要访问到两个点,就是说不仅仅是要访问栈顶元素,而且还要访问栈顶的下一个元素,个人觉得不符合stack 的定义,所以我就用了deque)
4. 最后结果是保存在deque中 , deque中的点元素就是组成所求凸包的点
代码: