Вычислительная геометрия
Векторное произведение, площадь многоугольника и выпуклая оболочка.
Почти вся олимпиадная геометрия строится на одном инструменте — векторном (косом) произведении:
cross(O, A, B) = (A - O) × (B - O) = (Ax-Ox)(By-Oy) - (Ay-Oy)(Bx-Ox)
Его знак говорит, куда поворачивает ломаная O→A→B: плюс — против часовой стрелки, минус — по часовой, ноль — три точки на одной прямой. А модуль равен удвоенной площади треугольника OAB.
Первое применение — площадь любого многоугольника («формула шнурков»): сумма косых произведений последовательных вершин.
Площадь многоугольника. Введите: 4, затем вершины по контуру: 0 0, 4 0, 4 3, 0 3
Прямоугольник 4×3 даёт 12. Заметьте: всё считается в ЦЕЛЫХ числах — храним удвоенную площадь и делим только при выводе. Золотое правило геометрии: оставайтесь в целых числах как можно дольше, double с его погрешностями — источник самых коварных багов.
Вторая классика — выпуклая оболочка: минимальный выпуклый многоугольник, содержащий все точки. Алгоритм Эндрю (monotone chain): сортируем точки по x, строим нижнюю цепочку слева направо, выкидывая точки, дающие «не тот» поворот, затем верхнюю — справа налево. O(n log n) на сортировку.
Выпуклая оболочка. Введите: 6, затем точки: 0 0, 2 0, 1 1, 2 2, 0 2, 1 -1
На примере внутренняя точка (1,1) исчезает, остаются пять вершин оболочки в порядке обхода против часовой стрелки.
Условие cross <= 0 выбрасывает и точки на прямой; замените на < 0, если коллинеарные точки нужно оставлять.
Задание: по готовой оболочке посчитайте её площадь формулой шнурков — две темы урока соединятся в одно решение.
Отметьте урок пройденным — вы прошли весь путь олимпиадника! Дальше — практика: решайте задачи, участвуйте в соревнованиях и возвращайтесь к урокам как к справочнику. Удачи!