凸多边形
--整个图形在任一条边的一侧
凸图形
--任意两个内点在任一内分点也在内部
凸包
--对于一个平面点集或者一个多边形,它的凸包指的是包含它的最小凸图形或最小凸区域
凸包的求法
--从最左边的最低点P0开始
--找到一个点P1,使得P0为起点的水平方向的射线到P0P1的角度最小
--然后找下一个P2,使得P2P1到P1P0角度最小。
--。。。。。。
--则P0P1P2....Pm是凸包上的顶点
--实际比较的时候,不一定要用角度来衡量
--可以采用叉乘来判断:只要知道相对的方向(顺时针还是逆时针)就可以
--比如判断AC1和AC2的夹角大小,只要判断AC1在AC2的右边
--这样每次查找需要O(n)的时间复杂度
--因此总的时间复杂度为O(n2)
卷包裹法的特殊情况
--多点共线的情况
--输出包括所有共线点
--输出不包括所有共线点
--解决
--如果要共线点:则共线的时候,根据与上一个凸包中的点发的距离从近到远选取
--如果不要共线点,则从远到近选取
Graham-Scan法
--卷包裹法每一步都确定性的求出凸包上的一条边
Graham-Scan算法每一步是得到一个临时的凸包
--只要当前点在上一条边的左手方向,就加入这个点;否则回溯,直到新的点在左手方向为止
极角序:
--以一个内部点X为中心,点集中的所有点按关于X的极角逆时针排序,就以X点出发向右延伸,平行于X轴的一条射线为排序的起始位置
--但是不便于计算,不能用叉乘,而需要用到三角函数
--还要保证起点一定在凸包上,否则会出错
Graham-Scan法序的选取
--选取最低点中最左的一个作为参考点
--用叉乘来排序所有点的相对位置
--时间复杂度
-排序O(n log n)
-扫描O(n)
-总的是O(n log n)
Graham-Scan法的特殊情况
重复点
--删除
共线点
--对于不要求求共线点的情况,可以对叉乘做严格的判定
--对于要求求共线点的情况,没有办法简单而完美的处理:
-A、B两点没有办法都加入凸包中
Graham-Scan法的另外一种序
用水平序
--先按Y坐标排
--Y相同的按X坐标排
2次扫描
--先从第1个点即0开始到最后1个点即9得到右链
--再从最后一个点即9点开始到第1个点即0,不包括已经在右链的点
处理特殊情况
--如果不要共线的点,则严格判断叉乘(即只有在左边才可以)
--如果要共线的点,则叉乘等于0即共线也认为可以
直观理解