convexHull实现
convexHull介绍
凸包(Convex Hull)问题表示如下:
在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。X的凸包可以用X内所有点(X1,…Xn)的凸组合来构造。
比较常用,也是实验中遇到的是二维平面上的凸包:给定平面上一个点集,凸包就是将最外围的点连接起来构成的凸多边形,它能包含点集中所有的点。可以想象成一条刚好包着所有点的橡皮圈。
注:这里对于边界的处理方法是舍弃位于边界(不包括顶点)上的点,如上图中的点9我们这里舍去,它不属于凸包,但它被凸包包围。
思路
首先选取横坐标最小的一个点,若有多个这样的点,选纵坐标最小(上图的红点)。然后对其余点进行遍历,以红点为极点,y轴正半轴方向为极轴,按照顺时针方向,计算其余点的角度。选取角度最小的点,加入一个点集。若有多个点角度相同,则计算红点到这些点的距离,选取距离最小的点加入该点集(9、10号点选10号),重复上述步骤,直到即将加入凸包的点为红点时结束循环,此时得到的点集即为凸包。
代码
calculateBearingToPoint
// 计算转向角度,以y轴正向为极坐标顺时针转动,角度限制在0~360°之间
public static double calculateBearingToPoint(double currentBearing, int currentX, int currentY,
int targetX, int targetY) {
double X = targetX - currentX, Y = targetY - currentY , targetAngle ;
if( X == 0 ) {
if( Y >= 0 )
targetAngle = - currentBearing;
else
targetAngle = 180 - currentBearing;
}
else {
if( X > 0 ) {
if( Y >= 0 )
targetAngle = 90 - currentBearing - 180 * Math.atan( Y/X ) / Math.PI ;