1. 概述
在本篇文章中,我们将介绍如何在 Java 中计算两个点之间的欧几里得距离。
2. 数学公式推导
假设平面上有两个点:
- 点 A 的坐标是 (x1, y1)
- 点 B 的坐标是 (x2, y2)
我们想要求出 AB 之间的直线距离。
首先,我们可以构建一个以 AB 为斜边的直角三角形:
根据勾股定理,直角三角形两条直角边的平方和等于斜边的平方:
AB² = AC² + CB²
接下来我们来计算 AC 和 CB 的长度:
✅ 显然有:
AC = y2 - y1
BC = x2 - x1
代入公式后得到:
distance² = (y2 - y1)² + (x2 - x1)²
最终可以得出两点间距离的计算公式:
distance = sqrt((y2 - y1)² + (x2 - x1)²)
有了这个公式,我们就可以着手进行 Java 实现了。
3. Java 实现方式
3.1. 手动实现数学公式
虽然 Java 标准库已经提供了相关工具类,但为了理解原理,我们先手动实现上面的公式:
public double calculateDistanceBetweenPoints(
double x1,
double y1,
double x2,
double y2) {
return Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1));
}
为了验证结果是否正确,我们可以构造一个经典的 3-4-5 直角三角形:
3² + 4² = 9 + 16 = 25 = 5²
测试代码如下:
@Test
public void givenTwoPoints_whenCalculateDistanceByFormula_thenCorrect() {
double x1 = 3;
double y1 = 4;
double x2 = 7;
double y2 = 1;
double distance = service.calculateDistanceBetweenPoints(x1, y1, x2, y2);
assertEquals(distance, 5, 0.001);
}
3.2. 使用 Math.hypot()
方法
⚠️ 上面的方法在处理大数时可能会出现溢出问题。为了避免中间计算过程中的数值溢出或下溢,Java 提供了 Math.hypot(double x, double y)
方法。
该方法直接返回 sqrt(x² + y²)
,并且不会发生中间溢出:
public double calculateDistanceBetweenPointsWithHypot(
double x1,
double y1,
double x2,
double y2) {
double ac = Math.abs(y2 - y1);
double cb = Math.abs(x2 - x1);
return Math.hypot(ac, cb);
}
同样的测试用例依然成立:
@Test
public void givenTwoPoints_whenCalculateDistanceWithHypot_thenCorrect() {
double x1 = 3;
double y1 = 4;
double x2 = 7;
double y2 = 1;
double distance = service.calculateDistanceBetweenPointsWithHypot(x1, y1, x2, y2);
assertEquals(distance, 5, 0.001);
}
✅ **建议使用 Math.hypot()
**:更安全、更健壮,尤其在涉及浮点运算精度问题时。
3.3. 使用 Point2D.distance()
方法
Java AWT 的 java.awt.geom.Point2D
类也提供了一个静态方法用于计算两点之间的距离:
public double calculateDistanceBetweenPointsWithPoint2D(
double x1,
double y1,
double x2,
double y2) {
return Point2D.distance(x1, y1, x2, y2);
}
同样使用之前的测试数据进行验证:
@Test
public void givenTwoPoints_whenCalculateDistanceWithPoint2D_thenCorrect() {
double x1 = 3;
double y1 = 4;
double x2 = 7;
double y2 = 1;
double distance = service.calculateDistanceBetweenPointsWithPoint2D(x1, y1, x2, y2);
assertEquals(distance, 5, 0.001);
}
4. 总结
本文介绍了三种在 Java 中计算两点之间欧几里得距离的方式:
方式 | 是否推荐 | 说明 |
---|---|---|
手动实现公式 | ❌ | 易懂但存在精度风险 |
Math.hypot() |
✅ | 安全可靠,推荐使用 |
Point2D.distance() |
✅ | 封装良好,适合图形场景 |
📌 踩坑提示:在实际开发中,如果涉及大量坐标运算或对精度要求较高,务必使用 Math.hypot()
或封装良好的库函数,避免手动平方开方带来的精度误差和溢出问题。
完整示例代码可以在 GitHub 上找到。