Прямая: три представления
Почему y = kx + b не годится, что такое нормаль и направляющая и как переходить между формами без деления.
5 мин
Школьная запись прямой в программе непригодна: вертикальную прямую ей не задать. Коэффициент — тангенс угла наклона, а у вертикали тангенса нет.
Обходить это условиями («если прямая вертикальная, то…») можно, но каждый такой случай — место для ошибки. Проще взять представление, которое работает всегда.
Общее уравнение
Точка лежит на прямой тогда и только тогда, когда подстановка даёт ноль.
Переход из школьной формы очевиден: равносильно , то есть , коэффициент при равен , свободный член .
А вот вертикальная прямая теперь задаётся спокойно: — это . Горизонтальная — .
Уравнение определено с точностью до множителя: и задают одну прямую. Это важно помнить при сравнении прямых на совпадение.
Нормаль
Вектор из коэффициентов уравнения называется нормалью, и он перпендикулярен прямой.
Почему. Возьмём две точки и на прямой. Обе удовлетворяют уравнению, значит и . Вычитая, получаем — а нулевое скалярное произведение и означает перпендикулярность. Вектор идёт вдоль прямой, значит нормаль ей перпендикулярна.
Проверено численно: для прямой, построенной по двум случайным точкам, скалярное произведение нормали и направляющей равно нулю на всех двухстах тысячах проверок.
Отсюда второе представление: точка на прямой плюс нормаль. По ним уравнение восстанавливается сразу: .
У прямой две нормали, и , и какая из них «правильная», не определено. Это регулярно всплывает, когда нужно отложить вектор в конкретную сторону, — об этом отдельно.
Направляющая
Третье представление: точка плюс направляющий вектор , идущий вдоль прямой. Тогда любая точка прямой — это
Такая запись называется параметрической и особенно удобна для лучей и отрезков: ограничив , получаем для луча и для отрезка.
Направляющая и нормаль перпендикулярны, поэтому одна получается из другой поворотом на .
Переходы
| из чего | во что | как |
|---|---|---|
| точка и нормаль | уравнение | |
| уравнение | нормаль | |
| нормаль | направляющая | |
| направляющая | нормаль | |
| две точки , | направляющая |
По двум точкам — без деления
Самый частый случай: прямая задана двумя точками, нужно уравнение.
Обе точки удовлетворяют уравнению. Вычтя одно равенство из другого, получаем . Решений бесконечно много (уравнение определено с точностью до множителя), и нам подойдёт любое:
struct Line { long long a, b, c; };
Line lineThrough(Point p, Point q) {
long long a = q.y - p.y;
long long b = p.x - q.x;
return {a, b, -(a * p.x + b * p.y)};
}
Обратите внимание: ни одного деления. Целые координаты дают целые коэффициенты, и вся дальнейшая работа с прямой остаётся точной.
Проверено: на двухстах тысячах случайных пар точек обе точки удовлетворяют полученному уравнению, а нормаль перпендикулярна направляющей.
Заметьте, что — это в точности направляющая , повёрнутая на . Формула не с потолка: это тот же переход из таблицы выше.
Совпадение и параллельность
Две прямые параллельны или совпадают, когда их нормали коллинеарны:
То есть векторное произведение нормалей равно нулю. Это же выражение — определитель системы, и на нём основано пересечение прямых.
Различить «параллельны» и «совпадают» можно проверкой пропорциональности всех трёх коэффициентов. Надёжнее — без деления: прямые совпадают, если ещё и и .
Нормированная форма
Если поделить уравнение на , получится форма, где . Тогда и — косинус и синус угла нормали, а — расстояние от начала координат до прямой.
В задачах эта форма встречается редко (она требует деления и портит точность), но именно из неё естественно выводится формула расстояния от точки до прямой.