Encontre a interseção de duas linhas em Java

Encontre a interseção de duas linhas em Java

1. Visão geral

Neste tutorial rápido, mostraremoshow to find the point of intersection of two lines defined by the linear functions na forma de declive-interceptação.

2. A fórmula matemática da interseção

Qualquer linha reta (exceto vertical) em um plano pode ser definida pela função linear:

y = mx + b

ondem é a inclinação eb é a interceptação y.

Para uma linha vertical,m seria igual ao infinito, é por isso que o estamos excluindo. Se duas linhas são paralelas, elas têm a mesma inclinação, ou seja, o mesmo valor dem.

Digamos que temos duas linhas. A primeira função define a primeira linha:

y = m1x + b1

E a segunda função define a segunda linha:

y = m2x + b2

image Queremos encontrar o ponto de intersecção dessas linhas. Obviamente, a equação é verdadeira para o ponto de interseção:

y1 = y2

Vamos substituir as variáveisy-:

m1x + b1 = m2x + b2

A partir da equação acima, podemos encontrar ax-coordinate:

x(m1 - m2) = b2 - b1
x = (b2 - b1) / (m1 - m2)

Finalmente, podemos encontrar a coordenada y do ponto de intersecção:

y = m1x + b1

Vamos agora passar para a parte de implementação.

3. Implementação Java

Em primeiro lugar, temos quatro variáveis ​​de entrada -m1, b1 para a primeira linha em2, b2 para a segunda linha.

Em segundo lugar, vamos converter o ponto de interseção calculado no objeto do tipojava.awt.Point.

Finalmente, as linhas podem ser paralelas, portanto, vamos fazer o valor retornadoOptional<Point>:

public Optional calculateIntersectionPoint(
    double m1,
    double b1,
    double m2,
    double b2) {

    if (m1 == m2) {
        return Optional.empty();
    }

    double x = (b2 - b1) / (m1 - m2);
    double y = m1 * x + b1;

    Point point = new Point();
    point.setLocation(x, y);
    return Optional.of(point);
}

Agora vamos escolher alguns valores e testar o método para linhas paralelas e não paralelas.

Por exemplo, vamos pegar o eixox (y = 0) como a primeira linha e a linha definida pory = x – 1 como a segunda linha.

Para a segunda linha, a inclinaçãom é igual a1, o que significa45 graus, e ay-intercepto é igual a-1, o que significa que o a linha intercepta o eixo syno ponto (0, -1).

É intuitivamente claro que o ponto de intersecção da segunda linha com o eixox deve ser(1,0):

image

Vamos verificar.

Em primeiro lugar, vamos ter certeza de que aPoint está presente, já que as linhas não são paralelas, e então verificar os valores dexey:

@Test
public void givenNotParallelLines_whenCalculatePoint_thenPresent() {
    double m1 = 0;
    double b1 = 0;
    double m2 = 1;
    double b2 = -1;

    Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2);

    assertTrue(point.isPresent());
    assertEquals(point.get().getX(), 1, 0.001);
    assertEquals(point.get().getY(), 0, 0.001);
}

Por último, vamos pegar duas linhas paralelas e verificar se o valor retornado está vazio:

image

@Test
public void givenParallelLines_whenCalculatePoint_thenEmpty() {
    double m1 = 1;
    double b1 = 0;
    double m2 = 1;
    double b2 = -1;

    Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2);

    assertFalse(point.isPresent());
}

4. Conclusão

Neste tutorial, mostramos como calcular o ponto de intersecção de duas linhas.

Como de costume, o código-fonte completo está disponívelover on GitHub.