Рубрики
Без рубрики

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

Быстрый взгляд на решение Java для простой математической проблемы

Автор оригинала: baeldung.

1. Обзор

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

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

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

y = mx + b

где м это склон и b это y-перехват.

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

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

y = m1x + b1

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

y = m2x + b2

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

y1 = y2

Давайте заменим y- Переменные:

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 тип.

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

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 – 1 в качестве второй строки.

Для второй линии склон м равна 1 что означает 45 градусов, и у -Перехват равен -1 что означает, что линия перехватывает у оси в точке (0, -1).

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

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

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

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

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

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

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

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