判断三点(a,b,c)是否在一条直线直线,其实只需要判断直线ab 和 直线 bc 的位置即可(两条直线的关系 相交 平行 重合)
判断两条直线位置关系只需判断两直线斜率k即可 k相同即可
计算垂足的话,如果两条直线垂直,那么他们斜率存在 k2 = (1/k1)
然后根据两相交线求相交点方程即可
public class Geo {
public static void main(String[] args) {
Point p0 = new Point(116.38094,39.92362);
Point p1 = new Point(116.38545,39.921959);
Point p2 = new Point(116.38546,39.921979);
GetFootOfPerpendicular(p0, p1, p2);
System.out.println(line(p0, p1, p2));
}
/**
* 判断三点是否在一条直线上
* @param start
* @param end
* @param point
* @return
*/
public static boolean line(Point start , Point end , Point point){
double sx , ex , px ;
double sy,ey,py ;
sx = start.x ;
ex= end.x ;
px = point.x;
sy = start.y;
ey = end.y;
py = point.y;
return Math.abs(((sx - ex) * (py - sy) - (px - sx ) * (sy - ey)) )<= 0.0000000001 ;
}
/**
* 计算垂足坐标
* @param start
* @param end
* @param point
* @return
*/
public static Point GetFootOfPerpendicular(Point start , Point end , Point point){
double k1 = (start.x - end.x) / (start.y - end.y);
double b1 = start.y - k1*start.x ;
double b2 = point.y - (1/k1)*point.x ;
double tempx =( b2 - b1 ) /( k1-(1/k1)) ;
double tempy =k1*tempx+ b1 ;
return new Point(tempx , tempy) ;
}
}
class Point {
public double x ;
public double y ;
public Point(double x , double y ){
this.x = x ;
this.y = y ;
}
@Override
public String toString() {
return "Point [x=" + x + ", y=" + y + "]";
}
}