1. 概述

在这篇简短的文章中,我们来探讨一下如何计算两条由斜截式方程定义的直线的交点。

2. 计算交点的数学公式

在平面直角坐标系中,任意一条非垂直直线都可以用如下线性函数表示:

y = mx + b

其中:

  • m 是直线的斜率(slope)
  • b 是 y 轴截距(y-intercept)

⚠️ 垂直线的斜率是无穷大,因此我们这里不考虑垂直线的情况。如果两条直线平行,则它们的斜率相等,即 m1 = m2

假设我们有两条直线,第一条直线的方程是:

y = m1x + b1

第二条直线的方程是:

y = m2x + b2

general-y1-y2

我们要找的就是这两条直线的交点。显然,在交点处,两个 y 值是相等的:

y1 = y2

将两个表达式代入:

m1x + b1 = m2x + b2

✅ 解出 x 坐标:

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

✅ 再代入任一方程解出 y 坐标:

y = m1x + b1

有了这些数学基础,我们就可以开始 Java 实现了。

3. Java 实现

首先,我们需要四个输入参数:

  • m1, b1:第一条直线的斜率和 y 截距
  • m2, b2:第二条直线的斜率和 y 截距

其次,我们将交点封装为 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);
}

🔍 测试案例 1:非平行线

比如我们取:

  • 第一条线是 x 轴:y = 0(即 m1 = 0, b1 = 0
  • 第二条线是:y = x - 1(即 m2 = 1, b2 = -1

直观上,第二条线和 x 轴的交点应该是 (1, 0)

non-parallel

我们来验证一下:

@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);
}

✅ 测试通过,说明我们的计算逻辑是正确的。

🔍 测试案例 2:平行线

取两条平行线:

  • 第一条:y = xm1 = 1, b1 = 0
  • 第二条:y = x - 1m2 = 1, b2 = -1

由于斜率相同,应该返回空值:

parallel

@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. 总结

本文展示了如何通过数学推导和 Java 编程,计算两条直线的交点,并处理了平行线的情况。代码结构简单,易于扩展和复用。

完整源码可以在 GitHub 上找到。


原始标题:Find the Intersection of Two Lines in Java