1. 概述
在这篇简短的文章中,我们来探讨一下如何计算两条由斜截式方程定义的直线的交点。
2. 计算交点的数学公式
在平面直角坐标系中,任意一条非垂直直线都可以用如下线性函数表示:
y = mx + b
其中:
m
是直线的斜率(slope)b
是 y 轴截距(y-intercept)
⚠️ 垂直线的斜率是无穷大,因此我们这里不考虑垂直线的情况。如果两条直线平行,则它们的斜率相等,即 m1 = m2
。
假设我们有两条直线,第一条直线的方程是:
y = m1x + b1
第二条直线的方程是:
y = m2x + b2
我们要找的就是这两条直线的交点。显然,在交点处,两个 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)
:
我们来验证一下:
@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 = x
(m1 = 1
,b1 = 0
) - 第二条:
y = x - 1
(m2 = 1
,b2 = -1
)
由于斜率相同,应该返回空值:
@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 上找到。