1. 概述

在本篇文章中,我们将介绍如何在 Java 中计算两个点之间的欧几里得距离。

2. 数学公式推导

假设平面上有两个点:

  • 点 A 的坐标是 (x1, y1)
  • 点 B 的坐标是 (x2, y2)

我们想要求出 AB 之间的直线距离。

首先,我们可以构建一个以 AB 为斜边的直角三角形:

triangle

根据勾股定理,直角三角形两条直角边的平方和等于斜边的平方:

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 上找到。


原始标题:Calculate the Distance Between Two Points in Java | Baeldung