как узнать пересекаются ли прямые по координатам
Нахождение точки пересечения двух прямых (и отрезков)
Введение
Довольно часто при разработке игр возникает необходимость находить точку пересечения прямых, отрезков, лучей и т.д. О том, как реализовать это максимально простым способом, в этой статье.
Популярные способы и их критика
Возможно, многие вспомнят способ из школьной алгебры — составить уравнения двух прямых, приравнять их правые части, найти x, и подставить его в уравнение прямой, чтобы найти y (Подробнее здесь).
Однако данный способ становится достаточно громоздким при написании кода (возможно поэтому вы сейчас читаете эту статью), к тому же, он не является универсальным: если одна из прямых параллельна оси Y, мы получим ошибку деления на ноль при вычислении углового коэффициента, и нам придётся прописать код на этот случай; если две прямые перпендикулярны осям, требуется повозиться с обработкой и этого случая. Такой код становится длинным и некрасивым.
В поисках более элегантного решения данной проблемы я наткнулся на весьма интересные способы, основанные на векторном умножении ( habr.com/ru/post/267037 ) и ray castinging’е ( ru.wikipedia.org/wiki/Ray_casting#Концепция ). Но на мой взгляд, они неоправданно сложные в вычислительном плане. Поэтому представляю вашему вниманию (и критике) мой способ.
Мой способ
Задача
Даны координаты двух отрезков. Нужно узнать, пересекаются ли отрезки, и если да, в какой точке. Для этой цели напишем функцию.
Решение
Условные обозначения для исключения недопониманий: a — вектор a, a(y) — проекция вектора a на ось Y, a
Представим наши отрезки в виде двух векторов: a
a(x)*k+b(x)*n=c(x)
a(y)*k+b(y)*n=c(y)
Наша задача сводится к нахождению этих коэффициентов (правда сказать, достаточно найти лишь один из них).
Внимательный читатель заметит, что при a(y)=0, мы получим ошибку. Пропишем ветвление на этапе нахождения a(y). Этот случай ещё проще, ведь мы сразу получаем уравнение с одной неизвестной.
Рекомендую попробовать вывести n самостоятельно, так будет понятнее, что откуда берётся в коде ниже.
Зная n, можно найти точку пересечения, для этого мы отнимем от координаты точки (x3,y3) вектор b*n
Собираем воедино
Данная функция принимает координаты вершин и возвращает значение 1, если прямые отрезков (именно прямые) пересекаются, иначе 0. Если же вам нужны координаты вершин, вы сможете взять их из массива dot[].
Важно: при введении двух совпадающих прямых, алгоритм выводит отсутствие пересечения. Алгоритм находит точку пересечения прямых, на которых лежат отрезки, поэтому точка может оказаться за пределами отрезка (что вам придётся дополнительно проверить в уже своём коде).
Пересечение прямых, угол и координаты пересечения
IP76 > Пересечение прямых, угол и координаты пересечения
Не такая тривиальная задача, скажу я вам. Всякий раз, когда возникает необходимость посчитать координату пересечения пары прямых, каждая из которых задана парой точек, снова беру блокнот и вывожу пару формул. И всякий раз – блин, ну это уже когда-то было, опять надо что-то делать с параллельными прямыми, опять появляется пакостная строго вертикальна линия, когда на (x1-x2) никак не разделить и т.д.
Поэтому – в подборку теории и практики, пригодится, сэкономим блокнот, спасем дерево.
Коэффициенты А, B, C
Все помним со школы формулу:
Тоже самое, но с претензией на образование (некоторые индивидуумы утверждают, что существует такая, и только такая, и никакая другая, формулировка):
Те же фаберже, только сбоку.
В теории надо составить и решить систему уравнений для первой и второй линии, где переменными будут X и Y точки пересечения.
Загвоздка в том, что мы не знаем коэффициенты для обеих линий.
В нашем случае известны координаты двух точек, по которым проходит линия. Поэтому мне, как последователю геометрического агностицизма, более привлекательная следующая формула:
Путем несложных операций приходим к следующей записи:
Глядя на вариант в исполнении высшего образования, получаем следующие формулы для нахождения коэффициентов:
Пока все идет отлично, нигде вероятного деления на ноль не встретилось.
Итак, мы можем легко найти два набора коэффициентов для первой и второй прямых. Переходим к системе уравнений.
Система уравнений
Как правило, подобная система уравнений решается путем выражения одной переменной через другую, подстановкой во второе уравнение, получая таким образом уравнение одной переменной. Далее переменная находится, подставляется, решается. Или определяется, что система решения не имеет.
Но нас интересует метод Крамера. Потому что с помощью этого метода можно получить сразу значения для обеих переменных, без дополнительных телодвижений.
Сразу же запишем метод под нашу систему.
Имеем следующую систему:
Исходя из метода, решение выглядит так:
Ага! Вот и возможное деление на ноль, скажете вы. И правильно! В этой, в высшей степени непозволительной ситуации, когда знаменатель равен нулю, решения нет, прямые либо параллельны, либо совпадают (что, впрочем, частный случай параллельности). В коде, естественно, этот момент надо учитывать.
Практика 1
Частные случаи
Принадлежность точки отрезку
В общем случае, чтобы определить принадлежность точки отрезку, надо установить две вещи:
Займемся пунктом 2. Данный факт можно установить двумя способами:
Практика показывает, что арифметический способ быстрее примерно в 3 раза. Когда-то я считал, что операции сравнения самые быстрые. Это давно уже не так.
Угол пересечения прямых
Угол пересечения прямых — это угол пересечения направляющих векторов. Т.е., взяв уже знакомые ранее точки p1 и p2, получим направляющий вектор V(p1,p2), и аналогично второй вектор M(p3,p4). В теории мы должны вычислить достаточно «затратную» функцию, с корнями, квадратами, дробями и арккосинусом.
Давайте не будем останавливаться на ней, она долгая, нудная и в нашем случае ненужная. Рассмотрим вектор:
Рис.4. Вектор V(p1,p2)
α — угол наклона вектора к оси X, который можно найти, как:
Что-то знакомое? Да это ни что иное, как коэффициенты в уравнении прямой от образованных фанатов. Может они и правы в своем испепеляющем фанатизме…
Одним словом, коэффициенты (расстояния) у нас уже есть по обеим прямым.
Рис.5. Пересекающиеся вектор V(p1,p2) и вектор M(p3,p4)
Судя по рисунку, угол между векторами, это сумма углов наклона векторов к оси X. Ммм… не совсем так, на самом деле это разность.
Рис.6. Пересекающиеся векторы в положительной Y
По рисунку явно видно, что угол между векторам это γ = (β — α).
В предыдущем примере все правильно, просто знаки углов разные, т.к. находятся по разные стороны от оси X, а формула работает та же.
От теории к практике
Теперь в плане практического применения. Мне нужно точно знать, откуда, куда и в каком направлении этот угол. В теории, углом между прямыми считается наименьший из пары γ и (180-γ). Так вот, нам это не надо. Какой угол получится – такой нам и нужен.
Поэтому, под углом между векторами понимаем угол от вектора V(p1,p2) к вектору M(p3,p4). Если знак угла – отрицательный, понимаем, что он против часовой стрелки, иначе – по часовой стрелке.
Следует заметить, что, зная коэффициенты, для нахождения угла пересечения, координаты уже не нужны. Листинг таков:
Точка пересечения прямых в пространстве онлайн
С помощю этого онлайн калькулятора можно найти точку пересечения прямых в пространстве. Дается подробное решение с пояснениями. Для нахождения координат точки пересечения прямых задайте вид уравнения прямых («канонический» или «параметрический» ), введите коэффициенты уравнений прямых в ячейки и нажимайте на кнопку «Решить». Теоретическую часть и численные примеры смотрите ниже.
Предупреждение
Точка пересечения прямых в пространстве − теория, примеры и решения
1. Точка пересечения прямых в пространстве, заданных в каноническом виде.
Пусть задана декартова прямоугольная система координат Oxyz и пусть в этой системе координат заданы прямые L1 и L2:
, | (1) |
, | (2) |
Найти точку пересечения прямых L1 и L2 (Рис.1).
Запишем уравнение (1) в виде системы двух линейных уравнений:
Сделаем перекрестное умножение в уравнениях (3) и (4):
Откроем скобки и переведем переменные в левую часть уравнений а остальные элементы в правую часть:
Аналогичным образом преобразуем уравнение (2):
Запишем уравнение (2) в виде системы двух линейных уравнений:
Сделаем перекрестное умножение в уравнениях (7) и (8):
Откроем скобки и переведем переменные в левую часть уравнений а остальные элементы в правую часть:
Решим систему линейных уравнений (5), (6), (9), (10) с тремя неизвестными x, y, z. Для этого представим эту систему в матричном виде:
2. Точка пересечения прямых в пространстве, заданных в параметрическом виде.
Пусть задана декартова прямоугольная система координат Oxyz и пусть в этой системе координат заданы прямые L1 и L2 в параметрическом виде:
Задачу нахождения нахождения точки пересечения прямых L1 и L2 можно решить разными методами.
Метод 1. Приведем уравнения прямых L1 и L2 к каноническому виду.
Для приведения уравнения (12) к каноническому виду, выразим параметр t через остальные переменные:
Так как левые части уравнений (14) равны, то можем записать:
Аналогичным образом приведем уравнение прямой L2 к каноническому виду:
Далее, для нахождения точки пересечения прямых, заданных в каноническом виде нужно воспользоваться параграфом 1.
Метод 2. Для нахождения точки пересечения прямых L1 и L2 решим совместно уравнения (12) и (13). Из уравнений (12) и (13) следует:
Из каждого уравнения (17),(18),(19) находим переменную t. Далее из полученных значений t выбираем те, которые удовлетворяют всем уравнениям (17)−(19). Если такое значение t не существует, то прямые не пересекаются. Если таких значений больше одного, то прямые совпадают. Если же такое значение t единственно, то подставляя это зачение t в (12) или в (13), получим координаты точки пересечения прямых (12) и (13).
3. Точка пересечения прямых в пространстве, заданных в разных видах.
Если уравнения прямых заданы в разных видах, то можно их привести к одному виду (к каноническому или к параметрическому) и найти точку пересечения прямых, описанных выше.
4. Примеры нахождения точки пересечения прямых в пространстве.
Пример 1. Найти точку пересечения прямых L1 и L2:
Представим уравнение (20) в виде двух уравнений:
Сделаем перекрестное умножение в уравнениях (22) и (23):
Откроем скобки и переведем переменные в левую часть уравнений а остальные элементы в правую часть:
Аналогичным образом поступим и с уравнением (2).
Представим уравнение (2) в виде двух уравнений:
Сделаем перекрестное умножение в уравнениях (7) и (8)
Откроем скобки и переведем переменные в левую часть уравнений а остальные элементы в правую часть:
Решим систему линейных уравнений (24), (25), (28), (29) с тремя неизвестными x, y, z. Для этого представим эту систему в виде матричного уравнения:
Решим систему линейных уравнений (30) отностительно x, y, z. Для решения системы, построим расширенную матрицу:
Обозначим через aij элементы i-ой строки и j-ого столбца.
Первый этап. Прямой ход Гаусса.
Исключим элементы 1-го столбца матрицы ниже элемента a1 1. Для этого сложим строку 3 со строкой 1, умноженной на −1:
Исключим элементы 2-го столбца матрицы ниже элемента a22. Для этого сложим строку 4 со строкой 2, умноженной на −1/4:
Сделаем перестановку строк 3 и 4.
Второй этап. Обратный ход Гаусса.
Исключим элементы 3-го столбца матрицы выше элемента a33. Для этого сложим строку 2 со строкой 3, умноженной на −4/3:
Исключим элементы 2-го столбца матрицы выше элемента a22. Для этого сложим строку 1 со строкой 2, умноженной на 3/4:
Делим каждую строку матрицы на соответствующий ведущий элемент (если ведущий элемент существует):
Ответ. Точка пересечения прямых L1 и L2 имеет следующие координаты:
Пример 2. Найти точку пересечения прямых L1 и L2:
Приведем параметрическое уравнение прямой L1 к каноническому виду. Выразим параметр t через остальные переменные:
Из равентсв выше получим каноническое уравнение прямой:
Представим уравнение (33) в виде двух уравнений:
Сделаем перекрестное умножение в уравнениях (34 и (35):
Откроем скобки и переведем переменные в левую часть уравнений а остальные элементы в правую часть:
Аналогичным образом поступим и с уравнением (2).
Представим уравнение (2) в виде двух уравнений:
Сделаем перекрестное умножение в уравнениях (38) и (39)
Откроем скобки и переведем переменные в левую часть уравнений а остальные элементы в правую часть:
Решим систему линейных уравнений (36), (37), (40), (41) с тремя неизвестными x, y, z. Для этого представим эту систему в виде матричного уравнения:
Решим систему линейных уравнений (42) отностительно x, y, z. Для решения системы, построим расширенную матрицу:
Обозначим через aij элементы i-ой строки и j-ого столбца.
Первый этап. Прямой ход Гаусса.
Исключим элементы 1-го столбца матрицы ниже элемента a1 1. Для этого сложим строку 3 со строкой 1, умноженной на −1/6:
Исключим элементы 2-го столбца матрицы ниже элемента a22. Для этого сложим строки 3 и 4 со строкой 2, умноженной на 8/21 и −1/7, соответственно:
Из расширенной матрицы восстановим последнюю систему линейных уравнений:
Уравнение (43) несовместна, так как несуществуют числа x, y, z удовлетворяющие уравнению (43). Следовательно система линейных уравнений (42) не имеет решения. Тогда прямые L1 и L2 не пересекаются. То есть они или параллельны, или скрещиваются.
Для того, чтобы решить геометрическую задачу методом координат, необходима точка пересечения, координаты которой используются при решении. Возникает ситуация, когда требуется искать координаты пересечения двух прямых на плоскости или определить координаты тех же прямых в пространстве. Данная статья рассматривает случаи нахождения координат точек, где пересекаются заданные прямые.
Точка пересечения двух прямых – определение
Необходимо дать определение точкам пересечения двух прямых.
Определение точки пересечения прямых звучит так:
Точка, в которой пересекаются две прямые, называют их точкой пересечения. Иначе говоря, что точка пересекающихся прямых и есть точка пересечения.
Рассмотрим на рисунке, приведенном ниже.
Нахождение координат точки пересечения двух прямых на плоскости
Перед нахождением координат точки пересечения двух прямых, необходимо рассмотреть предлагаемый ниже пример.
Чтобы пересечение прямых было действительным, необходимо, чтобы координаты точки М 0 удовлетворяли уравнениям прямых. Это проверяется при помощи их подстановки. Получаем, что
Изобразим данное решение на координатной прямой рисунка, приведенного ниже.
Для решения задачи необходимо подставить координаты точки во все уравнения. Получим, что
Переходим к нахождению координат точек пересечения двух прямых при помощи заданных уравнений на плоскости.
Получившиеся числа являются координатами, которые необходимо было найти.
Поиск координат сводится к решению системы линейных уравнений. Если по условию дан другой вид уравнения, тогда следует привести его к нормальному виду.
Отсюда имеем, что координаты – это точка пересечения
Применим метод Крамера для нахождения координат:
Для полного понимания темы, необходимо знать некоторые нюансы.
Предварительно необходимо понять расположение прямых. При их пересечении мы найдем координаты, в других случаях решения существовать не будет. Чтобы не делать эту проверку, можно составлять систему вида A 1 x + B 1 y + C 1 = 0 A 2 x + B 2 + C 2 = 0 При наличии решения делаем вывод о том, что прямые пересекаются. Если решение отсутствует, то они параллельны. Когда система имеет бесконечное множество решений, тогда говорят, что они совпадают.
Следует собрать уравнения в систему для последующего решения:
Ответ: заданные уравнения определяют одну и ту же прямую.
По условию возможно такое, прямые не будут пересекаться. Необходимо составить систему уравнений и решать. Для решения необходимо использовать метод Гаусса, так как с его помощью есть возможность проверить уравнение на совместимость. Получаем систему вида:
Получили неверное равенство, значит система не имеет решений. Делаем вывод, что прямые являются параллельными. Точек пересечения нет.
Второй способ решения.
Для начала нужно определить наличие пересечения прямых.
Ответ: точек пересечения нет, прямые параллельны.
Для решения составляем систему уравнений. Получаем
Нахождения координат точки пересечения двух прямых в пространстве
Таким же образом находятся точки пересечения прямых пространства.
Когда точка М 0 является точкой пересечения прямых, тогда ее координаты должны быть решениями обоих уравнений. Получим линейные уравнения в системе:
A 1 x + B 1 y + C 1 z + D 1 = 0 A 2 x + B 2 y + C 2 z + D 2 = 0 A 3 x + B 3 y + C 3 z + D 3 = 0 A 4 x + B 4 y + C 4 z + D 4 = 0
Рассмотрим подобные задания на примерах.
Система вида A 1 x + B 1 y + C 1 z + D 1 = 0 A 2 x + B 2 y + C 2 z + D 2 = 0 A 3 x + B 3 y + C 3 z + D 3 = 0 A 4 x + B 4 y + C 4 z + D 4 = 0 имеет только одно решение. Значит, прямые a и b пересекаются.
В остальных случаях уравнение не имеет решения, то есть и общих точек тоже. То есть невозможно найти точку с координатами, так как ее нет.
Поэтому система вида A 1 x + B 1 y + C 1 z + D 1 = 0 A 2 x + B 2 y + C 2 z + D 2 = 0 A 3 x + B 3 y + C 3 z + D 3 = 0 A 4 x + B 4 y + C 4 z + D 4 = 0 решается методом Гаусса. При ее несовместимости прямые не являются пересекающимися. Если решений бесконечное множество, то они совпадают.
Можно произвести решение при помощи вычисления основного и расширенного ранга матрицы, после чего применить теорему Кронекера-Капелли. Получим одно, множество или полное отсутствие решений.
Очевидно, что система не имеет решений, значит прямые не пересекаются. Точки пересечения нет.
Ответ: нет точки пересечения.
Если прямые заданы при помощи кононических или параметрических уравнений, нужно привести к виду уравнений пересекающихся плоскостей, после чего найти координаты.
Задаем прямые уравнениями двух пересекающихся плоскостей. Получаем, что