1. 概述

在二维几何计算中,一个常见问题是如何判断某点是否位于另外两点连成的直线上。本文将探讨在Java中实现这一判断的几种方法,并提供完整代码示例。

2. 理解问题本质

假设平面上有两点:点A坐标为(x1, y1),点B坐标为(x2, y2)。我们需要判断给定点C(x3,y3)是否位于A和B的连线上:

点C位于点A和点B之间示意图

上图中,点C位于A和B之间,而点D则不在。我们需要通过数学方法精确判断这种位置关系。

3. 使用距离公式判断

核心思路:若点C位于A和B之间,则距离AC + CB应等于AB:

距离(AC) + 距离(CB) == 距离(AB)

两点间距离计算公式:

distance = sqrt((y2 - y1)² + (x2 - x1)²)

用上图数据验证:

  • A(1,1)到B(5,5)距离 = 5.656
  • A(1,1)到C(3,3)距离 = 2.828
  • C(3,3)到B(5,5)距离 = 2.828

满足:2.828 + 2.828 ≈ 5.656 ✅

Java实现代码:

boolean isPointBetweenTwoPoints(double x1, double y1, double x2, double y2, double x, double y) {
    double distanceAC = Math.sqrt(Math.pow(x - x1, 2) + Math.pow(y - y1, 2));
    double distanceCB = Math.sqrt(Math.pow(x2 - x,2) + Math.pow(y2 - y, 2));
    double distanceAB = Math.sqrt(Math.pow(x2 - x1,2) + Math.pow(y2 - y1, 2));
    return Math.abs(distanceAC + distanceCB - distanceAB) < 1e-9;
}

⚠️ 注意:使用1e-9作为误差阈值处理浮点数精度问题

测试用例:

void givenAPoint_whenUsingDistanceFormula_thenCheckItLiesBetweenTwoPoints() {
    double x1 = 1;    double y1 = 1;
    double x2 = 5;    double y2 = 5;
    double x = 3;    double y = 3;
    assertTrue(findUsingDistanceFormula(x1, y1, x2, y2, x, y));
}

4. 使用斜率公式判断

核心思路:通过计算斜率判断三点共线,并验证点C在A和B的坐标范围内

斜率计算公式:

斜率 = (y2 - y1) / (x2 - x1)

判断条件:

  1. 斜率AB = 斜率AC(三点共线)
  2. 点C的x坐标在A和B之间
  3. 点C的y坐标在A和B之间

用上图数据验证:

  • 斜率AB = (5-1)/(5-1) = 1.0
  • 斜率AC = (3-1)/(3-1) = 1.0
  • C(3,3)的x在[1,5]内,y在[1,5]内 ✅

Java实现代码:

boolean findUsingSlopeFormula(double x1, double y1, double x2, double y2, double x, double y) {
    double slopeAB = (y2 - y1) / (x2 - x1);
    double slopeAC = (y - y1) / (x - x1);
    return slopeAB == slopeAC && 
           ((x1 <= x && x <= x2) || (x2 <= x && x <= x1)) && 
           ((y1 <= y && y <= y2) || (y2 <= y && y <= y1));
}

测试用例:

void givenAPoint_whenUsingSlopeFormula_thenCheckItLiesBetweenTwoPoints() { 
    double x1 = 1;    double y1 = 1;
    double x2 = 5;    double y2 = 5;
    double x = 3;    double y = 3;
    assertTrue(findUsingSlopeFormula(x1, y1, x2, y2, x, y));
}

5. 方法对比与选择

两种方法各有优劣:

方法 优点 缺点 适用场景
距离公式 直观易懂 需多次开方运算 精度要求高的场景
斜率公式 计算量小 需处理除零情况 性能敏感场景

⚠️ 踩坑提示:

  • 斜率法需处理x1=x2的垂直线情况
  • 距离法需注意浮点数精度问题
  • 边界条件(点与A/B重合)需特殊处理

6. 总结

本文提供了两种判断点是否在两点连线上的实用方法:

  1. 距离公式法:通过距离关系验证,直观但计算量大
  2. 斜率公式法:通过斜率一致性和坐标范围验证,高效但需处理特殊情况

完整代码示例可在GitHub仓库获取。实际应用中,建议根据具体场景选择合适方法,并做好边界条件处理。


原始标题:Check if a Point Is Between Two Points Drawn on a Straight Line in Java | Baeldung