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
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):
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:
@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.