Можно построить минимальную ограничивающую рамку (как минимальную площадь, так и минимальный периметр), используя Вращающийся штангенциркуль подход.
Прямоугольник минимальной площади, охватывающий выпуклый многоугольник P, имеет сторону, коллинеарную краю многоугольника.
Приведенный выше результат резко ограничивает диапазон возможных прямоугольников. Мало того, что нет необходимости проверять все направления, а проверять столько, сколько ребер многоугольника.
Иллюстрируем приведенный выше результат: четыре линии поддержки (красные), одна из которых совпадает с краем, определяют охватывающий прямоугольник (синий).
Простым алгоритмом было бы вычислить для каждого края соответствующий прямоугольник, коллинеарный ему. Но построение этого прямоугольника предполагает вычисление крайних точек многоугольника для каждого ребра, процесс, который занимает O (n) времени (для n ребер). Тогда весь алгоритм будет иметь квадратичную c временную сложность.
Можно найти гораздо более эффективный алгоритм. Вместо того, чтобы пересчитывать крайние точки, их можно обновлять за постоянное время с помощью поворотных суппортов. Действительно, рассмотрим выпуклый многоугольник с двумя парами опорных линий, проходящих через все четыре обычные крайние точки в направлениях x и y. Четыре линии уже определяют прямоугольник, охватывающий многоугольник. Но если многоугольник не имеет горизонтального или вертикального края, этот прямоугольник не может претендовать на минимальную площадь. Однако линии можно вращать, пока не будет выполнено указанное выше условие. Эта процедура лежит в основе следующего алгоритма. Предполагается, что входные данные представляют собой выпуклый многоугольник с n вершинами, заданными в порядке по часовой стрелке.
Вычислите все четыре крайние точки для многоугольника и назовите их xminP, xmaxP, yminP ymaxP.
Постройте четыре линии поддержки P через все четыре точки. Они определяют два набора «измерителей».
Если одна (или несколько) линий совпадает с краем, то вычисляют площадь прямоугольника, определяемую четырьмя линиями, и оставляют как минимум. В противном случае считайте текущую минимальную площадь бесконечной.
Поворачивайте линии по часовой стрелке, пока одна из них не совпадет с краем его многоугольника.
Вычислите площадь нового прямоугольника и сравните ее к текущей минимальной площади. При необходимости обновите минимум, отслеживая прямоугольник, определяющий минимум.
Повторяйте шаги 4 и 5, пока линии не будут повернуты на угол больше 90 градусов. Выведите минимальную площадь, охватывающую прямоугольник. Поскольку две пары «измерителей» определяют охватывающий прямоугольник, этот алгоритм рассматривает все возможные прямоугольники, которые могут иметь минимальную площадь. Кроме того, помимо инициализации, в главном l oop алгоритма столько шагов, сколько вершин. Таким образом, алгоритм имеет линейную временную сложность.