在Java中查找两条线的交点

2025/04/19

1. 概述

在本快速教程中,我们将展示如何找到斜率截距形式中线性函数定义的两条线的交点

2. 交集的数学公式

平面上的任何直线(垂直线除外)都可以用线性函数定义:

y = mx + b

其中m是斜率,b是y截距。

对于垂直线,m等于无穷大,这就是我们将其排除的原因。如果两条线平行,则它们的斜率相同,即m的值相同。

假设我们有两条线,第一个函数定义第一条:

y = m1x + b1

第二个函数定义第二条:

y = m2x + b2

我们想找到这两条线的交点,显然,对于交点,该方程成立:

y1 = y2

让我们代入y变量:

m1x + b1 = m2x + b2

从上面的等式我们可以找到x坐标

x(m1 - m2) = b2 - b1
x = (b2 - b1) / (m1 - m2)

最后,我们可以找到交点的y坐标

y = m1x + b1

现在让我们进入实现部分。

3. Java实现

首先,我们有4个输入变量:第一条线的m1、b1,以及第二条线的m2、b2。

其次,我们将计算出的交点转换为java.awt.Point类型的对象。

最后,线可能是平行的,因此我们将返回值设为Optional<Point>:

public Optional<Point> calculateIntersectionPoint(
        double m1,
        double b1,
        double m2,
        double b2) {

    if (m1 == m2) {
        return Optional.empty();
    }

    double x = (b2 - b1) / (m1 - m2);
    double y = m1 * x + b1;

    Point point = new Point();
    point.setLocation(x, y);
    return Optional.of(point);
}

现在让我们选择一些值并测试平行线和非平行线的方法。

例如,让我们以x轴(y = 0)作为第一条线,以y = x - 1定义的线作为第二条线。

对于第二条线,斜率m等于1,即45度,y截距等于-1,即该线在点(0,-1)处截取y轴。

直观上很明显,第二条线与x轴的交点一定是(1,0):

我们来检查一下。

首先,让我们确保存在一个点,因为线不是平行的,然后检查x和y的值:

@Test
public void givenNotParallelLines_whenCalculatePoint_thenPresent() {
    double m1 = 0;
    double b1 = 0;
    double m2 = 1;
    double b2 = -1;

    Optional<Point> point = service.calculateIntersectionPoint(m1, b1, m2, b2);

    assertTrue(point.isPresent());
    assertEquals(point.get().getX(), 1, 0.001);
    assertEquals(point.get().getY(), 0, 0.001);
}

最后,让我们取两条平行线并确保返回值为空:

@Test
public void givenParallelLines_whenCalculatePoint_thenEmpty() {
    double m1 = 1;
    double b1 = 0;
    double m2 = 1;
    double b2 = -1;

    Optional<Point> point = service.calculateIntersectionPoint(m1, b1, m2, b2);

    assertFalse(point.isPresent());
}

4. 总结

在本教程中,我们展示了如何计算两条线的交点。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章