«1. Обзор

В этом кратком руководстве мы покажем, как рассчитать расстояние между двумя точками в Java.

2. Математическая формула расстояния

Допустим, у нас есть две точки на плоскости: первая точка A имеет координаты (x1, y1), а вторая точка B имеет координаты (x2, y2) . Мы хотим вычислить AB, расстояние между точками.

Сначала построим прямоугольный треугольник с гипотенузой AB:

Согласно теореме Пифагора, сумма квадратов длин катетов треугольника равна квадрату длины гипотенузы треугольника: АВ2 = АС2 + СВ2.

Во-вторых, посчитаем AC и CB.

Очевидно:

AC = y2 - y1

Аналогично:

BC = x2 - x1

Подставим части уравнения:

distance * distance = (y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1)

Наконец, из приведенного выше уравнения можно вычислить расстояние между точками: ~~ ~

distance = sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1))

Теперь давайте перейдем к части реализации.

3. Реализация Java

3.1. Использование простой формулы

Хотя пакеты java.lang.Math и java.awt.geom.Point2D предоставляют готовые решения, давайте сначала реализуем приведенную выше формулу как есть:

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 * 3 + 4 * 4 = 5 * 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. Использование пакета java.lang.Math

Если результат умножения в методе calculateDistanceBetweenPoints() слишком велик, может произойти переполнение. В отличие от этого, метод Math.hypot() предотвращает промежуточное переполнение или потерю значимости:

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

3.3. Использование пакета java.awt.geom.Point2D

Наконец, давайте рассчитаем расстояние с помощью метода Point2D.distance():

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.

Как всегда, код, использованный в примерах, доступен на GitHub.