Векторное произведение
Число, по знаку которого видно, слева или справа. Площадь, повороты и связь со скалярным произведением.
4 мин
Векторное произведение на плоскости — тоже число (в трёхмерии это вектор, отсюда название):
В отличие от скалярного, оно антисимметрично: , потому что .
Именно эта асимметрия и делает его полезным: знак различает стороны.
Знак
| знак | смысл |
|---|---|
| положительный | слева от , поворот против часовой |
| ноль | векторы коллинеарны (сонаправлены или противоположны) |
| отрицательный | справа от , поворот по часовой |
Формулировка «слева» означает: встав в начало и глядя вдоль , до ближе повернуться влево, чем вправо.
Это второе из двух главных применений: проверка коллинеарности и определение стороны.
Вместе со скалярным
Два произведения вместе однозначно определяют, где находится один вектор относительно другого:
| скалярное | векторное | расположение |
|---|---|---|
| впереди слева | ||
| ровно вперёд | ||
| впереди справа | ||
| ровно налево | ||
| ровно направо | ||
| назад и влево | ||
| ровно назад | ||
| назад и вправо |
Восемь случаев, и все различаются двумя сравнениями с нулём. Задача «в какую сторону повернул объект» решается прямо по этой таблице.
Связь между произведениями
Обозначим вектор , повёрнутый на , то есть . Тогда
Проверяется подстановкой: . Проверено численно на двухстах тысячах случайных пар — тождество выполняется.
Смысл: это одно и то же произведение, просто второй аргумент повёрнут на прямой угол. Отсюда и совпадение картинок из предыдущей статьи, сдвинутое на четверть оборота.
Практический вывод: если в задаче нужно и то, и другое, а помните вы только одно — второе получается поворотом.
Площадь
Модуль векторного произведения — площадь параллелограмма на векторах и . Значит, площадь треугольника:
Никаких высот и синусов — одна формула по координатам. И, что важно, без деления, если убрать двойку: удвоенная площадь треугольника с целыми координатами всегда целая.
Отсюда же площадь многоугольника (формула площади Гаусса):
long long doubledArea = 0;
for (int i = 0; i < n; i++) {
int j = (i + 1) % n;
doubledArea += p[i] % p[j]; // векторное произведение
}
// площадь = |doubledArea| / 2
Знак суммы говорит об ориентации обхода: положительный — против часовой стрелки, отрицательный — по часовой. Это часто требуется отдельно.
Формула работает для любого несамопересекающегося многоугольника, в том числе невыпуклого.
Где применяется
Три точки на одной прямой? .
По какую сторону от прямой лежит точка? Знак . Это основа проверки пересечения отрезков.
Выпуклая оболочка. На каждом шаге проверяют, поворачивает ли очередная точка влево; если нет, предыдущую выбрасывают. Проверка — знак векторного произведения.
Точка внутри многоугольника? Для выпуклого — все векторные произведения со сторонами одного знака.
Сравнение по углу. Сортировка точек вокруг центра делается компаратором на векторных произведениях, без вычисления самих углов, — и это точнее и быстрее, чем через atan2.
Целые числа
Как и скалярное, векторное произведение целых координат целое. long long обязателен: при координатах до значение доходит до , то есть впритык к границе типа.
Если координаты могут быть до (например, после разности), нужен __int128 — либо переход к другой формулировке задачи.
Главное преимущество целых координат здесь в том, что сравнение с нулём точное. Никаких эпсилонов, никаких «почти коллинеарны». Поэтому в геометрии всегда стоит спросить себя, нельзя ли обойтись без вещественных чисел.