Две прямые пересекаются если их уравнения прямые

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

Пересечение прямых

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

Прямые это бесконечные линии, поэтому на плоскости они всегда пересекаются. Если прямые не пересекаются значит они параллельны. Частные случаи поведения прямых на плоскости: прямые неопределенны, прямые параллельны, прямые совпадают, одна из прямых параллельна оси X или Y. Общие случаи «нормального» пересечения прямых и частные случаи учитываются в программном коде класса Intersections прикрепленного исходника.

Прямые пересекаются

Даны две прямые AB и CD расположенные на одной плоскости. Они пересекаются и необходимо найти точку пересечения. За основу берем классическое уравнение прямой и подставляя данные получаем систему уравнений для двух прямых.

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

Классическое уравнение прямой: Запишем уравнение в одну строчку: Вычислим коэффициенты и свободные члены: В итоге получаем уравнение прямой с коэффициентами:

Уравнение с линейными коэффициентами отличается от уравнения с угловым коэффициентом отсутствием операции деления. Минимум операций деления упрощает создание устойчивого программного кода.

Точка пересечения прямых

Координаты точки пересечения это числа которые являются решением для каждого из уравнений прямых. Решая систему из двух уравнений находим в какой точке пересекаются прямые AB и CD.

Подставляем известные данные: Получаем два уравнения: Решаем систему уравнений: Найдено, прямые пересекаются в точке с координатами:

Прямые параллельны

Если прямые параллельны и лежат друг от друга на расстоянии, то у них нет общих точек. Совместная система уравнений не имеет решений. Эти уравнения существуют как бы сами по себе. В точности как их параллельные прямые.

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

Применяя формулу у.2 выведем уравнения прямых: Получаем систему уравнений:

Итог: система уравнений параллельных прямых не имеет решений.

Уравнение в программный код

На бумаге всё славненько, надо также сделать и в программном коде. Но программы не разбираются в уравнениях, им подавай переменные, постоянные и функции. Программный код не терпит неопределенности, он требует точные данные. Очень желательно строить выражения без операций деления. Преобразуем в программный код уравнение с коэффициентами (у.3) описанное выше. Для каждой прямой своё уравнение и переменные.

Точки определяющие прямые запишем в структуры Point. У каждой прямой две точки и они являются входными данными:
Определяем коэффициенты и свободные члены уравнений. Записываем их в соответствующие переменные:
Точка пересечения также будет храниться в структуре Point:

Вывод результата

В выражениях присутствует деление. Но знаменатель только тогда и только тогда будет равен нулю, когда обе прямые будут параллельны или оси X или оси Y. В этом случае они не пересекаются или совпадают. Это отслеживаемые состояния в классе Intersections , и вывод информации заканчивается до выбрасывания исключения при делении на ноль.

Проверка параллельности и совпадения

Проверка на перпендикулярность

Класс Intersections

Исходник представляет собой два класса: класс вычисления точки пересечения прямых и информационный класс выдающий множество дополнительных сведений о свойствах исследуемых прямых.

Краткий листинг исходника дающий представление о структуре классов:

Применение класса Intersections

Класс class Intersections легко встраивается в любой исходный код. Точки определяющие прямые являются входными данными. На выходе получаем результат пересечения, координаты точки пересечения. Для дальнейшей обработки результатов можно использовать идентификатор свойства пересечения и дополнительную текстовую информацию.

Прикрепленный файл

Прикрепленный файл архива содержит исходник классов Intersections, Info и программу демонстрирующую работу класса Intersections в режиме вычисления точки пересечения прямых на плоскости. Исходный код написан на языке C#, но его легко можно преобразовать в код на другом языке программирования. Для работы демонстрационной программы необходима установка платформы. .NET Core 3.1.

Скачать исходник

  • Файл: IntersectionsLineLine.zip
  • Размер: 84 Кбайт
  • Загрузки: 540

Похожая тематика

Пересечение луча и прямой на плоскости »

Пересечение прямых. Точка пересечения двух прямых

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

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

Если система уравнений:

  • имеет единственное решение, то прямые пересекаются;
  • имеет бесконечное множество решений, то прямые совпадают;
  • не имеет решений, то прямые не пересекаются (прямые параллельны между собой)

Решение: Для вычисления координат точки пересечения прямых, решим систему уравнений:

y = 2 x — 1 y = -3 x + 1

Вычтем из первого уравнения второе

y — y = 2 x — 1 — (-3 x + 1) y = -3 x + 1 => 0 = 5 x — 2 y = -3 x + 1

Из первого уравнения найдем значение x

5 x = 2 y = -3 x + 1 => x = 2 5 = 0.4 y = -3 x + 1

Подставим значение x во второе уравнение и найдем значение y

x = 0.4 y = -3·(0.4) + 1 = -1.2 + 1 = -0.2

Ответ. Точка пересечения двух прямых имеет координаты (0.4, -0.2)

Решение: Для вычисления координат точки пересечения прямых, решим систему уравнений:

y = 2 x — 1 x = 2 t + 1 y = t

В первое уравнение подставим значения x и y из второго и третьего уравнений.

t = 2·(2 t + 1) — 1 x = 2 t + 1 y = t => t = 4 t + 1 x = 2 t + 1 y = t =>

-3 t = 1 x = 2 t + 1 y = t => t = — 1 3 x = 2 t + 1 y = t

Подставим значение t во второе и третье уравнение

t = — 1 3 x = 2·(- 1 3 ) + 1 = — 2 3 + 1 = 1 3 y = — 1 3

Ответ. Точка пересечения двух прямых имеет координаты ( 1 3 , — 1 3 )

Решение: Для вычисления координат точки пересечения прямых, решим систему уравнений:

2 x + 3 y = 0 x — 2 3 = y 4

Из второго уравнения выразим y через x

2 x + 3 y = 0 y = 4· x — 2 3

Подставим y в первое уравнение

2 x + 3·4· x — 2 3 = 0 y = 4· x — 2 3 => 2 x + 4·( x — 2) = 0 y = 4· x — 2 3 =>

2 x + 4 x — 8 = 0 y = 4· x — 2 3 => 6 x = 8 y = 4· x — 2 3 =>

x = 8 6 = 4 3 y = 4· x — 2 3 => x = 8 6 = 4 3 y = 4· 4/3 — 2 3 = 4· -2/3 3 = — 8 9

Ответ. Точка пересечения двух прямых имеет координаты ( 4 3 , — 8 9 )

Решение: Обе прямые заданы уравнениями с угловым коэффициентом. Так как k 1 = k 2 = 2, то прямые параллельны. Так как эти прямые не совпадают то точек пересечения нет.

Решим также эту задачу используя систему уравнений:

y = 2 x — 1 y = 2 x + 1

Вычтем из первого уравнения второе

y — y = 2 x — 1 — (2 x + 1) y = -3 x + 1 => 0 = -2 y = -3 x + 1

В первом уравнении получили противоречие (0 ≠ -2), значит система не имеет решений — отсутствуют точки пересечения прямых (прямые параллельны).

Ответ. Прямые не пересекаются (прямые параллельны).

Решение: Подставим координаты точки N в уравнения прямых.

Ответ. Так как оба уравнения превратились в тождества, то точка N — точка пересечения этих прямых.

Точка пересечения двух прямых в пространстве

Если система уравнений:

  • имеет единственное решение, то прямые пересекаются;
  • имеет бесконечное множество решений, то прямые совпадают;
  • не имеет решений, то прямые не пересекаются (прямые параллельны или скрещиваются между собой)

Решение: Составим систему уравнений

x — 1 = a y — 1 = a z — 1 = a x — 3 -2 = b 2 — y = b z = b => x = a + 1 y = a + 1 z = a + 1 x — 3 -2 = b 2 — y = b z = b =>

Подставим значения x , y , z из 1, 2, 3 уравнений в 4, 5, 6 уравнения

x = a + 1 y = a + 1 z = a + 1 a + 1 — 3 -2 = b 2 — ( a + 1) = b a + 1 = b => x = a + 1 y = a + 1 z = a + 1 a — 2 -2 = b 1 — a = b a + 1 = b

К шестому уравнению добавим пятое уравнение

x = a + 1 y = a + 1 z = a + 1 a — 2 -2 = b 1 — a = b a + 1 + (1 — a ) = b + b => x = a + 1 y = a + 1 z = a + 1 a — 2 -2 = b 1 — a = b b = 1

Подставим значение b в четвертое и пятое уравнения

x = a + 1 y = a + 1 z = a + 1 a — 2 -2 = 1 1 — a = 1 b = 1 => x = a + 1 y = a + 1 z = a + 1 a — 2 = -2 a = 0 b = 1 =>

x = a + 1 y = a + 1 z = a + 1 a = 0 a = 0 b = 1 => x = 0 + 1 = 1 y = 0 + 1 = 1 z = 0 + 1 = 1 a = 0 a = 0 b = 1

Ответ. Прямые пересекаются в точке с координатами (1, 1, 1).

Решение: Составим систему уравнений заменив во втором уравнении параметр t на a

x = 2 t — 3 y = t z = — t + 2 x = a + 1 y = 3 a — 2 z = 3

Подставим значения x , y , z из 1, 2, 3 уравнений в 4, 5, 6 уравнения

x = 2 t — 3 y = t z = — t + 2 2 t — 3 = a + 1 t = 3 a — 2 — t + 2 = 3 => x = 2 t — 3 y = t z = — t + 2 2 t = a + 4 t = 3 a — 2 t = -1 =>

Подставим значение t из шестого уравнения в остальные уравнения

x = 2·(-1) — 3 y = (-1) z = -(-1) + 2 2·(-1) = a + 4 -1 = 3 a — 2 t = -1 => x = -5 y = -1 z = 3 a = -6 a = 1 3 t = -1

Ответ. Так как -6 ≠ 1 3 , то прямые не пересекаются.

Нахождение точки пересечения двух прямых (и отрезков)

Введение

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

Популярные способы и их критика

Возможно, многие вспомнят способ из школьной алгебры — составить уравнения двух прямых, приравнять их правые части, найти x, и подставить его в уравнение прямой, чтобы найти y (Подробнее здесь).

Однако данный способ становится достаточно громоздким при написании кода (возможно поэтому вы сейчас читаете эту статью), к тому же, он не является универсальным: если одна из прямых параллельна оси Y, мы получим ошибку деления на ноль при вычислении углового коэффициента, и нам придётся прописать код на этот случай; если две прямые перпендикулярны осям, требуется повозиться с обработкой и этого случая. Такой код становится длинным и некрасивым.

В поисках более элегантного решения данной проблемы я наткнулся на весьма интересные способы, основанные на векторном умножении ( habr.com/ru/post/267037 ) и ray castinging’е ( ru.wikipedia.org/wiki/Ray_casting#Концепция ). Но на мой взгляд, они неоправданно сложные в вычислительном плане. Поэтому представляю вашему вниманию (и критике) мой способ.

Мой способ

Задача

Даны координаты двух отрезков. Нужно узнать, пересекаются ли отрезки, и если да, в какой точке. Для этой цели напишем функцию.

Решение

Условные обозначения для исключения недопониманий: a — вектор a, a(y) — проекция вектора a на ось Y, a — вектор a, заданный координатами x1,y1.

Представим наши отрезки в виде двух векторов: a и b. Обратите, внимание, что вектор b имеет противоположное от ожидаемого направление. Введём вектор c. Заметим, что a*k+b*n=c, где k,n — некоторые коэффициенты. Таким образом, получаем систему уравнений:

a(x)*k+b(x)*n=c(x)
a(y)*k+b(y)*n=c(y)
Наша задача сводится к нахождению этих коэффициентов (правда сказать, достаточно найти лишь один из них).

Предлагаю домножить обе части нижнего уравнения на q= -a(x)/a(y). Так после сложения двух уравнений, мы сразу избавимся от k. Нахождение n сведётся к решению обыкновенного линейного уравнения. Важно обратить внимание, что у n может не быть решения.

Внимательный читатель заметит, что при a(y)=0, мы получим ошибку. Пропишем ветвление на этапе нахождения a(y). Этот случай ещё проще, ведь мы сразу получаем уравнение с одной неизвестной.

Рекомендую попробовать вывести n самостоятельно, так будет понятнее, что откуда берётся в коде ниже.

Зная n, можно найти точку пересечения, для этого мы отнимем от координаты точки (x3,y3) вектор b*n

Собираем воедино

Данная функция принимает координаты вершин и возвращает значение 1, если прямые отрезков (именно прямые) пересекаются, иначе 0. Если же вам нужны координаты вершин, вы сможете взять их из массива dot[].

Важно: при введении двух совпадающих прямых, алгоритм выводит отсутствие пересечения. Алгоритм находит точку пересечения прямых, на которых лежат отрезки, поэтому точка может оказаться за пределами отрезка (что вам придётся дополнительно проверить в уже своём коде).


источники:

http://ru.onlinemschool.com/math/library/analytic_geometry/lines_intersection/

http://habr.com/ru/post/523440/