欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Geo平面内三点是否在一条直线上

程序员文章站 2022-04-01 17:45:35
...
判断三点(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 + "]";
	}	
}

  

转载于:https://www.cnblogs.com/wangnanhui/articles/7009453.html