Выпуклая оболочка
Резинка вокруг точек: минимальный выпуклый контур.
1function convexHull(pts: Array<[x: number, y: number]>): Array<[x: number, y: number]> {2 // старт — самая нижняя-левая; сортировка по полярному углу3 const start = pts.reduce((m, p) => (p[1] < m[1] || (p[1] === m[1] && p[0] < m[0])) ? p : m)4 const sorted = pts.filter((p) => p !== start)5 .sort((a, b) => angle(start, a) - angle(start, b))6 7 const stack: typeof pts = [start]8 for (const p of sorted) {9 // правый поворот? верхушка была ошибкой10 while (stack.length > 1 && cross(stack.at(-2)!, stack.at(-1)!, p) <= 0) {11 stack.pop()12 }13 stack.push(p)14 }15 return stack16}17 18function cross(o: P, a: P, b: P): number {19 return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0])20}Проблема
Резинка вокруг точек: минимальный выпуклый контур.
Что вы видите
Точки по углу от нижней; стек выкидывает правые повороты — остаются только углы.
Как это работает
Грэхем: сортировка по полярному углу + стек с проверкой поворота. O(n log n). Каждый выброшенный — внутри оболочки навсегда.
Пошаговый разбор
- 01
Старт
Самая нижняя точка.
- 02
Сортировка
По углу от старта.
- 03
Стек
Правый поворот — выброс.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Картография
Границы регионов.
Коллизии
Упрощение хитбоксов.
Статистика
Выбросы = вне оболочки.
Связанные алгоритмы
«Обернуть точки резинкой за O(n log n)»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.