计算直角坐标系中,两点之间距离、两条直线之间的交点坐标、某点是否在某条直线上。
两点之间距离,该方法遵循公式:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 Point p1 = new Point(5, 6);// 定义第一个点的坐标(5,6) 2 Point p2 = new Point(7, 8);// 定义第二个点的坐标(7,8) 3 //定位坐标 4 System.out.println("p1的x坐标为" + p1.getX()); 5 System.out.println("p1的y坐标为" + p1.getY()); 6 System.out.println("p2的x坐标为" + p2.getX()); 7 System.out.println("p2的y坐标为" + p2.getY()); 8 // 计算两点间距离公式 9 double juli = Math.sqrt(Math.abs((p1.getX() - p2.getX()) * (p1.getX() - p2.getX()) + (p1.getY() - p2.getY()) * (p1.getY() - p2.getY()))); 10 System.out.println("两点间的距离是:" + juli);
两点之间的交点坐标,遵循公式:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @Getter 2 @Setter 3 public class Lseg { 4 5 public Lseg(Light.Point startPoint, Light.Point endPoint) { 6 this.startPoint = startPoint; 7 this.endPoint = endPoint; 8 } 9 10 private Light.Point startPoint; 11 12 private Light.Point endPoint; 13 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 * 获取两条线之间的交点 3 * @param lsegA 起点 4 * @param lsegB 终点 5 */ 6 public static Light.Point getCrossPoint(Lseg lsegA, Lseg lsegB) { 7 double x; 8 double y; 9 double x1 = lsegA.getStartPoint().getX(); 10 double y1 = lsegA.getStartPoint().getY(); 11 double x2 = lsegA.getEndPoint().getX(); 12 double y2 = lsegA.getEndPoint().getY(); 13 double x3 = lsegB.getStartPoint().getX(); 14 double y3 = lsegB.getStartPoint().getY(); 15 double x4 = lsegB.getEndPoint().getX(); 16 double y4 = lsegB.getEndPoint().getY(); 17 double k1 = Float.MAX_VALUE; 18 double k2 = Float.MAX_VALUE; 19 boolean flag1 = false; 20 boolean flag2 = false; 21 22 if ((x1 - x2) == 0) 23 flag1 = true; 24 if ((x3 - x4) == 0) 25 flag2 = true; 26 27 if (!flag1) 28 k1 = (y1 - y2) / (x1 - x2); 29 if (!flag2) 30 k2 = (y3 - y4) / (x3 - x4); 31 32 if (k1 == k2) 33 return null; 34 35 if (flag1) { 36 if (flag2) 37 return null; 38 x = x1; 39 if (k2 == 0) { 40 y = y3; 41 } else { 42 y = k2 * (x - x4) + y4; 43 } 44 } else if (flag2) { 45 x = x3; 46 if (k1 == 0) { 47 y = y1; 48 } else { 49 y = k1 * (x - x2) + y2; 50 } 51 } else { 52 if (k1 == 0) { 53 y = y1; 54 x = (y - y4) / k2 + x4; 55 } else if (k2 == 0) { 56 y = y3; 57 x = (y - y2) / k1 + x2; 58 } else { 59 x = (k1 * x2 - k2 * x4 + y4 - y2) / (k1 - k2); 60 y = k1 * (x - x2) + y2; 61 } 62 } 63 if (between(x1, x2, x) && between(y1, y2, y) && between(x3, x4, x) && between(y3, y4, y)) { 64 Light.Point point = new Light.Point(); 65 point.setX(x); 66 point.setY(y); 67 if (point.equals(lsegA.getStartPoint()) || point.equals(lsegA.getEndPoint())) 68 return null; 69 return point; 70 } else { 71 return null; 72 } 73 } 74 75 public static boolean between(double a, double b, double target) { 76 if (target >= a - 0.01 && target <= b + 0.01 || target <= a + 0.01 && target >= b - 0.01) 77 return true; 78 else 79 return false; 80 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @Test 2 void test01() { 3 Light.Point point1 = new Light.Point(); 4 point1.setX(1); 5 point1.setY(1); 6 Light.Point point2 = new Light.Point(); 7 point2.setX(5); 8 point2.setY(5); 9 Lseg lseg = new Lseg(point1, point2); 10 Light.Point point3 = new Light.Point(); 11 point3.setX(1); 12 point3.setY(5); 13 Light.Point point4 = new Light.Point(); 14 point4.setX(5); 15 point4.setY(1); 16 Lseg lseg1 = new Lseg(point3, point4); 17 Light.Point point = getCrossPoint(lseg, lseg1); 18 System.out.println("直线A 坐标为 1,1 5,5"); 19 System.out.println("直线B 坐标为 1,5 5,1"); 20 System.out.println("两线之间的交点为 " + point.getX() + "," + point.getY()); 21 }
某点是否在某条直线上,遵循公式:
(Q-P1)*(P1-P2)=0 即三点共线
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @Getter 2 @Setter 3 public class LineVo { 4 5 public LineVo(Light.Point startPoint, Light.Point endPoint) { 6 this.startPoint = startPoint; 7 this.endPoint = endPoint; 8 } 9 10 private Light.Point startPoint; 11 12 private Light.Point endPoint; 13 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 * 判断某点是否在一条直线上 3 * 4 * @param lineVo 线 5 * @param point 点 6 */ 7 public static boolean flagOnLine(LineVo lineVo, Light.Point point) { 8 if (((point.getX() - lineVo.getStartPoint().getX()) * (lineVo.getStartPoint().getY() - lineVo.getEndPoint().getY())) 9 == ((lineVo.getStartPoint().getX() - lineVo.getEndPoint().getX()) * (point.getY() - lineVo.getStartPoint().getY())) 10 && (point.getX() >= Math.min(lineVo.getStartPoint().getX(), lineVo.getEndPoint().getX()) 11 && point.getX() <= Math.max(lineVo.getStartPoint().getX(), lineVo.getEndPoint().getX())) 12 && ((point.getY() >= Math.min(lineVo.getStartPoint().getY(), lineVo.getEndPoint().getY())) 13 && (point.getY() <= Math.max(lineVo.getStartPoint().getY(), lineVo.getEndPoint().getY())))) { 14 return true; 15 } else { 16 return false; 17 } 18 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @Test 2 void test02() { 3 LinePoint startPoint = new LinePoint(); 4 startPoint.setXCoordinates(19d); 5 startPoint.setYCoordinates(25d); 6 LinePoint endPoint = new LinePoint(); 7 endPoint.setXCoordinates(19d); 8 endPoint.setYCoordinates(30d); 9 LineVo lineVo1 = new LineVo(startPoint, endPoint); 10 Light.Point point = new Light.Point(); 11 point.setX(19); 12 point.setY(26); 13 Assert.isTrue(LineCalculateUtil.flagOnLine(lineVo1, point), "不在一条线上"); 14 }
甘于平凡,做一个甘于平凡的人,菜米油盐,生老病死。