Точки и векторы
Вся вычислительная геометрия — это арифметика над парами чисел. Базовые операции и то, почему точка и вектор в коде одно и то же.
3 мин
Школьная геометрия работает с объектами: треугольник , биссектриса, признак равенства. В программе так нельзя — компьютер не умеет «применить теорему».
Поэтому вычислительная геометрия устроена иначе: всё живёт в системе координат, любой объект — это набор чисел, а решение — цепочка формул над этими числами.
Хорошая новость: формул немного, и почти все выводятся из двух произведений, о которых в следующих статьях.
Точка
Точка задаётся парой координат . Больше про неё сказать нечего.
Вектор
Вектор — направленный отрезок. Вектор из точки в точку имеет координаты
то есть «насколько сдвинуться по » и «насколько по ».
Здесь возникает вопрос: почему у вектора координат столько же, сколько у точки, хотя задаётся он двумя точками?
Ответ: векторы, равные по длине и направлению, считаются одним и тем же вектором. Начальная точка вектору безразлична — важна только разность. Формально это класс эквивалентности; практически это значит, что любой вектор можно перенести началом в ноль, и тогда его конец окажется в точке с теми же координатами.
Именно поэтому в коде для точки и для вектора используют одну структуру. Различие только в том, как мы её трактуем.
Обратный вектор получается сменой знака у обеих координат: .
Операции
Сложение. — это «пройти по , затем по ». В координатах просто:
Школьные «правило треугольника» и «правило параллелограмма» — два способа нарисовать одно и то же. В координатах ни то, ни другое не нужно.
Вычитание. . Геометрически: если отложить оба вектора из одной точки, разность — вектор из конца в конец .
Умножение на число. — растяжение в раз. При отрицательном вектор ещё и разворачивается.
Длина. По теореме Пифагора:
Отсюда расстояние между точками — длина вектора между ними.
Длина в квадрате
Отдельно стоит завести функцию, возвращающую квадрат длины, без корня.
long long len2() const { return x * x + y * y; }
Причина практическая: сравнить два расстояния — то же самое, что сравнить их квадраты, а корень вносит погрешность и требует перехода к вещественным числам. Если в задаче нужно «найти ближайшую пару» или «самый длинный отрезок», работайте с квадратами и оставайтесь в целых числах.
Это общий принцип раздела: избегайте корней и делений, пока они действительно не понадобятся.
Поворот на 90 градусов
Единственный поворот, который встречается постоянно и не требует тригонометрии:
Проверяется подстановкой в формулы синуса и косинуса от , но проще запомнить: координаты меняются местами, одна из них меняет знак.
Поворот на произвольный угол тоже существует и выражается через синус и косинус, но в задачах встречается реже — и почти всегда его удаётся обойти.
Что дальше
Пока мы умеем складывать, вычитать, растягивать и мерить длину. Этого мало: неизвестно, как узнать угол, как понять, слева или справа лежит точка, как найти расстояние до прямой.
Всё это даёт пара произведений — скалярное и векторное. Они и есть содержание раздела; остальное — их применения.