Найти пересечение двух линий в Java

Найти пересечение двух линий в Java

1. обзор

В этом кратком руководстве мы покажемhow to find the point of intersection of two lines defined by the linear functions в форме пересечения наклона.

2. Математическая формула пересечения

Любая прямая линия (кроме вертикальной) на плоскости может быть определена линейной функцией:

y = mx + b

гдеm - наклон, аb - точка пересечения по оси y.

Для вертикальной линииm будет равно бесконечности, поэтому мы его исключаем. Если две прямые параллельны, они имеют одинаковый наклон, то есть одинаковое значениеm.

Допустим, у нас есть две строки. Первая функция определяет первую строку:

y = m1x + b1

И вторая функция определяет вторую строку:

y = m2x + b2

image Мы хотим найти точку пересечения этих линий. Очевидно, что уравнение верно для точки пересечения:

y1 = y2

Заменимy-variables:

m1x + b1 = m2x + b2

Из приведенного выше уравнения можно найти координатуx-:

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

Наконец, мы можем найти y-координату точки пересечения:

y = m1x + b1

А теперь перейдем к части реализации.

3. Реализация Java

Во-первых, у нас есть четыре входных переменных -m1, b1 для первой строки иm2, b2 для второй строки.

Во-вторых, преобразуем вычисленную точку пересечения в объект типаjava.awt.Point.

Наконец, линии могут быть параллельны, поэтому давайте сделаем возвращаемое значениеOptional<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);
}

Теперь давайте выберем некоторые значения и протестируем метод для параллельных и непараллельных линий.

Например, возьмем осьx (y = 0) в качестве первой линии, а линию, определяемуюy = x – 1, в качестве второй линии.

Для второй строки наклонm равен1, что означает45 градусов, а угол пересеченияy равен-1, что означает, что линия пересекает ось syв точке (0, -1).

Интуитивно понятно, что точка пересечения второй линии с осьюx должна быть(1,0):

image

Давай проверим.

Во-первых, давайте убедимся, что присутствуетPoint, так как линии не параллельны, а затем проверим значенияx иy:

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

Наконец, возьмем две параллельные линии и убедимся, что возвращаемое значение пусто:

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. Заключение

В этом уроке мы показали, как вычислить точку пересечения двух линий.

Как обычно, доступен полный исходный кодover on GitHub.