Рассчитать расстояние между двумя точками в Java
1. обзор
В этом кратком руководстве мы покажем, как рассчитать расстояние между двумя точками в Java.
2. Математическая формула расстояния
Допустим, у нас есть две точки на плоскости: первая точка A имеет координаты (x1, y1), а вторая точка B имеет координаты (x2, y2). Мы хотим рассчитать AB, расстояние между точками.
Во-первых, давайте построим прямоугольный треугольник с гипотенузой AB:
Согласно теореме Пифагора сумма квадратов длин катетов треугольника равна квадрату длины гипотенузы треугольника:AB2 = AC2 + CB2.
Во-вторых, рассчитаем 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.
Как всегда, в примерах доступен кодover on GitHub.