Calcular a distância entre dois pontos em Java

Calcular a distância entre dois pontos em Java

1. Visão geral

Neste tutorial rápido, mostraremos como calcular a distância entre dois pontos em Java.

2. A fórmula matemática da distância

Digamos que temos dois pontos em um plano: o primeiro ponto A tem as coordenadas (x1, y1) e o segundo ponto B tem as coordenadas (x2, y2). Queremos calcular AB, a distância entre os pontos.

Em primeiro lugar, vamos construir um triângulo retângulo com a hipotenusa AB:

image

De acordo com o teorema de Pitágoras, a soma dos quadrados dos comprimentos das pernas do triângulo é igual ao quadrado do comprimento da hipotenusa do triângulo:AB2 = AC2 + CB2.

Em segundo lugar, vamos calcular AC e CB.

Obviamente:

AC = y2 - y1

Similarmente:

BC = x2 - x1

Vamos substituir as partes da equação:

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

Finalmente, a partir da equação acima, podemos calcular a distância entre os pontos:

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

Agora vamos passar para a parte de implementação.

3. Implementação Java

3.1. Usando Fórmula Simples

Embora java.lang.Mathejava.awt.geom.Point2D packages forneçam soluções prontas, vamos primeiro implementar a fórmula acima como é:

public double calculateDistanceBetweenPoints(
  double x1,
  double y1,
  double x2,
  double y2) {
    return Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1));
}

Para testar a solução, vamos pegar o triângulo com pernas3e4 (como mostrado na imagem acima). É claro que o número5 é adequado como o valor da hipotenusa:

3 * 3 + 4 * 4 = 5 * 5

Vamos verificar a solução:

@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. Usando o pacotejava.lang.Math

Se o resultado da multiplicação no métodocalculateDistanceBetweenPoints() for muito grande, pode ocorrer estouro. Ao contrário disso, o métodoMath.hypot() evita estouro intermediário ou underflow:

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

Vamos pegar os mesmos pontos de antes e verificar se a distância é a mesma:

@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. Usando o pacotejava.awt.geom.Point2D

Finalmente, vamos calcular a distância com o métodoPoint2D.distance():

public double calculateDistanceBetweenPointsWithPoint2D(
    double x1,
    double y1,
    double x2,
    double y2) {

    return Point2D.distance(x1, y1, x2, y2);
}

Agora vamos testar o método da mesma maneira:

@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. Conclusão

Neste tutorial, mostramos algumas maneiras de calcular a distância entre dois pontos em Java.

Como sempre, o código usado nos exemplos está disponívelover on GitHub.