convex hull是一个计算机几何问题。对于平面上N个坐标不同的点,如何选取并连接其中部分点构成一个多边形使得该平面所有点都被包括在这一多边形内。如图:
对于输入的任意一组点,输出构成convex hull的顶点坐标
Convex Hull有如下两个几何性质:
1 从一点出发进行连接,遍历所有顶点只需要逆时针旋转。
2 Convex Hull各个顶点关于y坐标最小的顶点的极距角(polar angle)为递增关系。
极距角:
取一点O为投影中心,以一定的半径作一个球,称为投影球;通过球心作一个水平面Q,称为投影面;投影面与投影球相交为一圆,它相当于地球的赤道,称为基圆;垂直投影面的直径NS,称为投影轴;投影轴与投影球面的两个交点N和S,即投影球的北极和南极,它们分别称为上目测点和下目测点。
球面上的任一点A的位置可以用球面坐标(spherical coordinate):方位角φ与极距角ρ来确定,极距角ρ相当于纬度,方位角φ相当于经度。
极距角是指该球面投影点与北极N之间的弧角,也即为投影轴与晶面法线之间的夹角,这个角度应在0°~90°之间,如果在90°~180°之间,意指该晶面位于下半球。
http://blog.sina.com.cn/s/blog_4ae87643010005xv.html
根据以上两个性质实现的Graham Scan 算法可以解决Convex Hull问题:
1 选取y坐标最小的点P
2 根据和点P间极距角对其他各点进行排序
3 按顺序遍历所有点,排除所有无法构成逆时针路径的点
该算法3个重点:
1找到y坐标最小的点
2把各点按照极距角排序
3判断p1 ——> p2 ——> p3是否为逆时针路径
4判断一个在边界上的点是否为顶点
1,2 都使用了比较,因此可以看出咋比较时往往不是单纯使用compareTo,经常我们要按具体情况定义比较规则
3 4问题有一种算法可以解决,如图
计算三点构成的矢量面积,计算公式如图。
如矢量面积大于0,该3点为逆时针方向连接
如矢量面积小于0,该3点为顺时针方向连接,应舍去p2,连接p1和p3继续判断
如矢量面积为0,说明3点共线,p2此时不是顶点,应舍去