EduBrick

Прямая: три представления

Почему y = kx + b не годится, что такое нормаль и направляющая и как переходить между формами без деления.

5 мин

Школьная запись прямой y=kx+by = kx + b в программе непригодна: вертикальную прямую ей не задать. Коэффициент kk — тангенс угла наклона, а у вертикали тангенса нет.

Обходить это условиями («если прямая вертикальная, то…») можно, но каждый такой случай — место для ошибки. Проще взять представление, которое работает всегда.

Общее уравнение

ax+by+c=0ax + by + c = 0

Точка (x,y)(x, y) лежит на прямой тогда и только тогда, когда подстановка даёт ноль.

Переход из школьной формы очевиден: y=kx+by = kx + b равносильно kxy+b=0kx - y + b = 0, то есть a=ka = k, коэффициент при yy равен 1-1, свободный член bb.

А вот вертикальная прямая теперь задаётся спокойно: x=5x = 5 — это 1x+0y5=01 \cdot x + 0 \cdot y - 5 = 0. Горизонтальная — 0x+1y3=00 \cdot x + 1 \cdot y - 3 = 0.

Уравнение определено с точностью до множителя: 2x+4y6=02x + 4y - 6 = 0 и x+2y3=0x + 2y - 3 = 0 задают одну прямую. Это важно помнить при сравнении прямых на совпадение.

Нормаль

Вектор n=(a,b)\vec{n} = (a, b) из коэффициентов уравнения называется нормалью, и он перпендикулярен прямой.

Почему. Возьмём две точки PP и QQ на прямой. Обе удовлетворяют уравнению, значит (n,P)=c(\vec{n}, P) = -c и (n,Q)=c(\vec{n}, Q) = -c. Вычитая, получаем (n,PQ)=0(\vec{n}, \vec{PQ}) = 0 — а нулевое скалярное произведение и означает перпендикулярность. Вектор PQ\vec{PQ} идёт вдоль прямой, значит нормаль ей перпендикулярна.

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

Отсюда второе представление: точка на прямой плюс нормаль. По ним уравнение восстанавливается сразу: c=(n,P)c = -(\vec{n}, P).

У прямой две нормали, (a,b)(a, b) и (a,b)(-a, -b), и какая из них «правильная», не определено. Это регулярно всплывает, когда нужно отложить вектор в конкретную сторону, — об этом отдельно.

Направляющая

Третье представление: точка плюс направляющий вектор s\vec{s}, идущий вдоль прямой. Тогда любая точка прямой — это

P+ts,tRP + t \cdot \vec{s}, \qquad t \in \mathbb{R}

Такая запись называется параметрической и особенно удобна для лучей и отрезков: ограничив tt, получаем t0t \ge 0 для луча и t[0,1]t \in [0, 1] для отрезка.

Направляющая и нормаль перпендикулярны, поэтому одна получается из другой поворотом на 90°90°.

Переходы

из чего во что как
точка PP и нормаль (a,b)(a, b) уравнение c=(aPx+bPy)c = -(a \cdot P_x + b \cdot P_y)
уравнение нормаль n=(a,b)\vec{n} = (a, b)
нормаль (a,b)(a, b) направляющая s=(b,a)\vec{s} = (-b, a)
направляющая (sx,sy)(s_x, s_y) нормаль n=(sy,sx)\vec{n} = (-s_y, s_x)
две точки PP, QQ направляющая s=PQ\vec{s} = \vec{PQ}

По двум точкам — без деления

Самый частый случай: прямая задана двумя точками, нужно уравнение.

Обе точки удовлетворяют уравнению. Вычтя одно равенство из другого, получаем a(x1x2)+b(y1y2)=0a(x_1 - x_2) + b(y_1 - y_2) = 0. Решений бесконечно много (уравнение определено с точностью до множителя), и нам подойдёт любое:

a=y2y1,b=x1x2,c=(ax1+by1)a = y_2 - y_1, \qquad b = x_1 - x_2, \qquad c = -(a x_1 + b y_1)
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)};
}

Обратите внимание: ни одного деления. Целые координаты дают целые коэффициенты, и вся дальнейшая работа с прямой остаётся точной.

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

Заметьте, что (a,b)=(y2y1,  x1x2)(a, b) = (y_2 - y_1,\; x_1 - x_2) — это в точности направляющая PQ\vec{PQ}, повёрнутая на 90°90°. Формула не с потолка: это тот же переход из таблицы выше.

Совпадение и параллельность

Две прямые параллельны или совпадают, когда их нормали коллинеарны:

a1b2a2b1=0a_1 b_2 - a_2 b_1 = 0

То есть векторное произведение нормалей равно нулю. Это же выражение — определитель системы, и на нём основано пересечение прямых.

Различить «параллельны» и «совпадают» можно проверкой пропорциональности всех трёх коэффициентов. Надёжнее — без деления: прямые совпадают, если ещё и a1c2a2c1=0a_1 c_2 - a_2 c_1 = 0 и b1c2b2c1=0b_1 c_2 - b_2 c_1 = 0.

Нормированная форма

Если поделить уравнение на a2+b2\sqrt{a^2 + b^2}, получится форма, где a2+b2=1a^2 + b^2 = 1. Тогда aa и bb — косинус и синус угла нормали, а c-c — расстояние от начала координат до прямой.

В задачах эта форма встречается редко (она требует деления и портит точность), но именно из неё естественно выводится формула расстояния от точки до прямой.