1 什么是convex hull
就是凸包,是计算几何中的一个概念,计算几何是计算机图形学的基础之一。
对于二维平面来说是这样的:对于二维平面上的点集,凸包是位于最外层的点构成的包围其它所有的点的凸多边形。
2 Graham's scan算法
第一,找initial点
y最小的点,如果有多个,选择x也最小的点。
第二,对所有其它的点进行排序
计算initial点到所有其它点的连线和x轴的夹角,从小到大排列。
第三,找right turn
所谓的right turn就是从上个点到本点向对于上上个点到上个点是不是向右转了。如果是的话,就要删除掉上个点,而直接连上上个点,直到是left turn为止,进栈。
第四,找right turn的起始点
从第三个点就可以开始找了,先将前两个点入栈。
遍历完之后,栈里面所剩的点构成的多边形就是凸包。
3 算法的时间复杂度
O(nlgn)
4 算法的正确性
因为算法遍历了所有的点,并且保证了所有的点都在外接多边形构成的边的左边,所以就保证了所有的点都在该外接多边形的内部。 另外,所有的边都是向左走的,因此这个多边形是一个凸多边形,所以算法是正确的。