Пересечение прямых и отрезков
Основные понятия
геометрическое множество точек, продолжающееся в обе стороны бесконечно; в координатной плоскости её обычно задают уравнением.
часть прямой, ограниченная двумя конечными точками: все точки между этими двумя концами включительно.
В планиметрии и аналитической геометрии работе с пересечениями предшествует понимание форм, в которых задают прямые. Наиболее привычными для школьной практики являются две формы записи: наклонно-смещённая и общая. Наклонно-смещённая записывает зависимость ординаты от абсциссы через угловой коэффициент и сдвиг, а общая форма удобна для систем уравнений.
В рамках аналитического подхода каждая прямая описывается математически: её уравнение записывают явно или неявно, что позволяет применять алгебраические методы поиска точек пересечения и проводить анализ особых случаев (параллельность, совпадение).
Уравнения прямых
Наклонно-смещённая форма прямой выражается через угловой коэффициент и свободный член следующим образом: \(y = kx + b\).
Общая (линейная) форма прямой векторно-координатного уравнения имеет вид: \(ax + by + c = 0\).
При поиске точки пересечения двух прямых удобно рассматривать систему их уравнений и решать её алгебраически: \(\begin{cases}a_1 x + b_1 y + c_1 = 0\\ a_2 x + b_2 y + c_2 = 0\end{cases}\).
Решение такой системы через метод детерминантов даёт координаты пересечения при условии ненулевого определителя матрицы коэффициентов: \(x = \dfrac{b_1 c_2 - b_2 c_1}{a_1 b_2 - a_2 b_1}\) и \(y = \dfrac{c_1 a_2 - c_2 a_1}{a_1 b_2 - a_2 b_1}\), где знаменатель определяется как \(D = a_1 b_2 - a_2 b_1\).
Параметрическое представление и векторные формулы
Альтернативный и часто более наглядный способ задания прямой — параметрический: точку на прямой получают как сумму начальной точки и параметра, умноженного на направляющий вектор. Это записывают в компактной векторной форме: \((x,y) = (x_0,y_0) + t(d_x,d_y)\).
Для вычислений в 2D удобно использовать псевдо-скалярную «векторную» операцию, часто называемую поперечным произведением (или псевдовекторным произведением) двух векторов в плоскости. Для двух векторов это выражается формулой: \(\operatorname{cross}((x_1,y_1),(x_2,y_2)) = x_1 y_2 - y_1 x_2\).
Именно через эту операцию вычисляют параметр пересечения двух параметрических прямых: если направляющие векторы не коллинеарны, то параметр одного из них равен частному от соответствующих поперечных произведений; формула для первого параметра выглядит так: \(t = \dfrac{\operatorname{cross}((x_3-x_1,y_3-y_1),(d_x^{(2)},d_y^{(2)}))}{\operatorname{cross}((d_x^{(1)},d_y^{(1)}),(d_x^{(2)},d_y^{(2)}))}\), а для второго параметра — так: \(u = \dfrac{\operatorname{cross}((x_3-x_1,y_3-y_1),(d_x^{(1)},d_y^{(1)}))}{\operatorname{cross}((d_x^{(1)},d_y^{(1)}),(d_x^{(2)},d_y^{(2)}))}\).
Пересечение двух прямых: общие случаи
Системный подход даёт единый критерий существования единственной точки пересечения: ненулевой знаменатель в формулах решения, то есть ненулевой определитель. Это условие записи определителя равного нулю можно формально представить так: \(D = a_1 b_2 - a_2 b_1\). Если это выражение не обращается в ноль, прямые пересекаются в единственной точке, координаты которой вычисляются по формулам, приведённым выше.
Если же определитель равен нулю, то прямые либо параллельны, либо совпадают. Для проверки совпадения требуется подставить любую точку одной прямой в уравнение другой или воспользоваться коллинеарностью направляющих векторов и проверкой сдвига.
Практически важно уметь отличать чистую параллельность от совпадения: для совпадения необходимо, чтобы векторы были коллинеарны и вектор сдвига между прямыми был коллинеарен ним же; в противном случае имеет место параллельное смещение без пересечения.
Пересечение отрезков: дополнения к прямым
Отрезок задают как часть прямой между двумя конечными точками; поэтому результаты для прямых дополняются условием, что найденная точка принадлежит обоим отрезкам. В параметрической постановке это означает, что параметры при направляющих векторах должны лежать в отрезке параметров: \(t \in [0,1]\) и \(u \in [0,1]\).
Если прямые коллинеарны, проверка принадлежности отрезков сводится к проверке пересечения проекций отрезков на координатную ось. Это удобно записать через общую проекционную формулу: \(\operatorname{sgn}\left(\operatorname{cross}((x_2-x_1,y_2-y_1),(x_3-x_1,y_3-y_1))\right)\).
Ещё один распространённый подход — ориентирование трёх точек с помощью знака поперечного произведения. Ориентация помогает определять взаимное расположение точек и отрезков: формально выражение ориентации для трёх точек имеет вид \(|D| < \varepsilon\) и используется в алгоритмах пересечения отрезков.
Алгоритм и численные тонкости
При численных вычислениях знаменатель и сравнения с нулём требуют аккуратности из-за погрешностей с плавающей точкой. Поэтому применяют эпсилон-условия: например сравнение по модулю с порогом записывают как \(\varepsilon = 10^{-9}\), где порог можно выбрать, например, равным \(y = 2x + 1\).
Алгоритм нахождения пересечения отрезков в обобщённом виде включает этапы: 1) вычислить знаменатель (детерминант); 2) при ненулевом знаменателе вычислить параметры по формулам через поперечные произведения; 3) проверить принадлежность параметров отрезку параметров по условиям \(t \in [0,1]\) и \(u \in [0,1]\); 4) при нулевом знаменателе проверить коллинеарность и проекции (формула \(\operatorname{sgn}\left(\operatorname{cross}((x_2-x_1,y_2-y_1),(x_3-x_1,y_3-y_1))\right)\)).
При реализации в программировании полезно учитывать случаи, когда точки совпадают, один или оба отрезка вырождаются в точку, и использовать стабильные арифметические операции, чтобы не получить ошибочный результат на границе точного совпадения.
Геометрические случаи и частные положения
Классические частные случаи, которые часто встречаются на задачах: пересечение в единственной точке, отсутствие пересечения (параллельные, разнесённые отрезки), совпадение (полное или частичное перекрытие). Для их различения применяют совокупность проверок: детерминант (или поперечное произведение), проекции и ориентации точек.
Часто в задачах появляется необходимость определить, пересекаются ли отрезки, считая граничные случаи пересечения допустимыми. В этом случае включают равенства в проверках проекций и интервалов параметров (вид \(\operatorname{sgn}\left(\operatorname{cross}((x_2-x_1,y_2-y_1),(x_3-x_1,y_3-y_1))\right)\) и \(t \in [0,1]\)).
При анализе на бумаге удобно сочетать численные вычисления с рисунком (схемой). Для иллюстрации алгоритма можно представить два отрезка и отметить направляющие векторы и искомую точку пересечения, что проясняет порядок вычислений и проверки условий.
Задачи и примеры
Пример 1. Найти точку пересечения прямых, заданных уравнениями \(y = -x + 4\) и \(2x + 1 = -x + 4\).
Решение. Сравнивая правые части получаем равенство: \(3x = 3\). Приведя подобные, получаем: \(x = 1\), откуда \(y = 3\). Подставляя значение в одно из уравнений, получаем: \((x,y) = (0,0) + t(2,2)\) — это координата ординаты искомой точки.
Пример 2. Проверить пересечение отрезков AB и CD, где A(0,0), B(2,2), C(0,2), D(2,0). Параметрические уравнения отрезков задаются как: для AB — \((x,y) = (0,2) + u(2,-2)\), для CD — \(\operatorname{cross}((2,2),(2,-2)) = 2\cdot(-2) - 2\cdot 2 = -8\).
Решение. Вычислим поперечное произведение направляющих векторов: \(t = \tfrac{1}{2}\). Оно ненулевое, значит прямые не коллинеарны. По формулам параметров находим \(u = \tfrac{1}{2}\) и \((x,y) = (1,1)\), оба параметра лежат в отрезке параметров, следовательно, отрезки пересекаются. Координаты точки пересечения равны.
Эти примеры иллюстрируют как алгебраические формулы, так и параметрический подход. На практике следует выбирать форму задания прямой и метод решения, исходя из удобства вычислений и требований к надёжности при численных вычислениях.