DEV//UNIT

Выпуклая оболочка

Резинка вокруг точек: минимальный выпуклый контур.

время O(n log n)память O(n)уровень: средний
Что происходит сейчас0/0
Нажмите Play, чтобы запустить сценарий
TypeScript — активная строка подсвечена шагом
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 stack
16}
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). Каждый выброшенный — внутри оболочки навсегда.

Пошаговый разбор

  1. 01

    Старт

    Самая нижняя точка.

  2. 02

    Сортировка

    По углу от старта.

  3. 03

    Стек

    Правый поворот — выброс.

Complexity и ограничения

time
O(n log n)
space
O(n)

Сложность см. в шапке страницы.

Edge cases

  • Пустой вход

    Корректная тривиальная обработка.

  • Вырожденный случай

    Минимум работы — сразу ответ.

Где встречается в реальности

Картография

Границы регионов.

Коллизии

Упрощение хитбоксов.

Статистика

Выбросы = вне оболочки.

Связанные алгоритмы

Shorts

«Обернуть точки резинкой за O(n log n)»

Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.

Shorts 9:16

Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.

Обернуть точки резинкой за O(n log n)
Нажмите Play
Бит 1/6 · 0–2 с
Hook
script-setup.ru/algorithms/convex-hull