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 OptionalcalculateIntersectionPoint( 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; Optionalpoint = 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; Optionalpoint = service.calculateIntersectionPoint(m1, b1, m2, b2); assertFalse(point.isPresent()); }
4. Заключение
В этом учебнике мы показали, как рассчитать точку пересечения двух линий.
Как обычно, полный исходный код доступен более на GitHub .