1. Обзор
В этом кратком руководстве мы покажем, как вычислить расстояние между двумя точками в Java.
2. Математическая формула расстояния
Допустим, у нас есть две точки на плоскости: первая точка A имеет координаты (x1, y1), а вторая точка B имеет координаты (x2, y2). Мы хотим вычислить AB, расстояние между точками.
Во-первых, давайте построим прямоугольный треугольник с гипотенузой 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.Математика и 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.Математический пакет
Если результат умножения в методе 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 .