Наибольшая окружность внутри невыпуклого многоугольника

Как найти самый большой круг, который может поместиться внутри вогнутого многоугольника?

алгоритм грубой силы в порядке, если он может обрабатывать полигоны с ~ 50 вершинами в режиме реального времени.

5 ответов


ключом к решению этой проблемы является первое наблюдение: центр наибольшего круга, который поместится внутри произвольного многоугольника, - это точка, которая:

  1. внутри многоугольника; и
  2. удаленный от любой точки На краях полигона.

Почему? Потому что каждая точка на краю окружности равноудалены от центра. По определению, наибольший круг будет иметь наибольший радиус и будет касаться полигона по крайней мере две точки, поэтому, если вы найдете точку внутри самого дальнего от многоугольника, вы найдете центр круга.

эта проблема появляется в географии и решается итеративно с любой произвольной точностью. Ее называют полюсами труднодоступности. См.Полюса недоступности: алгоритм расчета для самых отдаленных мест на Земле.

основной алгоритм работает следующим образом:

  1. определить R как прямолинейную область из (xмин, yмин) to (xМакс, yМакс);
  2. разделить R на произвольное количество точек. В статье в качестве эвристики используется 21 (что означает деление высоты и ширины на 20);
  3. обрезать любые точки, которые находятся вне полигона;
  4. для остальных найти точку, которая наиболее удалена от любой точки На границе;
  5. С этой точки определите новый R с меньшими интервалами и границами и повторите с шага 2 чтобы получить любой произвольный точный ответ. В статье R уменьшается в 2 раза от квадратного корня.

одно замечание, Как проверить, находится ли точка внутри многоугольника или нет: самое простое решение этой части проблемы-бросить луч вправо от точки. Если он пересекает нечетное число ребер, он находится внутри многоугольника. Если это четное число, то и снаружи.

кроме того, что касается тестирования расстояния до любого края, вам нужно два случая подумайте:

  1. точка перпендикулярна точке на этом краю (в пределах двух вершин); или
  2. Это не так.

(2) легко. Расстояние до края-это минимальное из расстояний до двух вершин. Для (1) ближайшей точкой на этом краю будет точка, которая пересекает край под углом 90 градусов, начиная с точки, которую вы тестируете. См.расстояние от точки до луча или сегмент.


в случае, если кто-то ищет практическую реализацию, я разработал более быстрый алгоритм, который решает эту проблему для заданной точности и сделал ее библиотекой JavaScript. Это похоже на итерационный алгоритм сетки, описанный @cletus, но он гарантированно получит глобальный оптимум, а также в 20-40 раз быстрее на практике.

проверьте это:https://github.com/mapbox/polylabel


алгоритм O(N log(n)):

  1. построить Вороного Схемы ребер в P. Это можно сделать, например, с помощью удачи.
  2. для узлов Вороного (точек, равноудаленных от трех и более ребер) внутри P;
  3. найдите узел с максимальным расстоянием до ребер в P. Этот узел является центром максимальной вписанной окружности.

резюме: теоретически это можно сделать за O (n) время. На практике вы можете сделать это за O(N log n) время.

обобщенные диаграммы Вороного.

Если вы считаете, вершин и ребер многоугольника как набор сайтов и мозаика в интерьере в "ближайших соседей клетки", то вы получите так называемый (обобщенная) диаграмма Вороного. Диаграмма Вороного состоит из узлов и соединяющих их ребер. The клиренс узла является расстояние до определяющих граней многоугольника.

Voronoi diagram of a polygon
(Здесь многоугольник даже имеет отверстия; принцип все еще работает.)

ключевое наблюдение теперь состоит в том, что центр максимальной вписанной окружности касается трех граней (вершин или ребер) многоугольника, и никакая другая грань не может быть ближе. Таким образом, центр должен лежать на узле Вороного, i.e, узел с наибольшим зазором.

в Примере над узлом, который отмечает Центр максимального вписанного круг касается двух ребер и вершины многоугольника.

медиальной осью, кстати, является диаграмма Вороного с удаленными ребрами Вороного, исходящими из рефлекторных вершин. Следовательно, центр максимальной вписанной окружности также лежит на медиальной оси.

Источник: A статья в блоге моего, который имеет дело с обобщениями максимальных вписанных кругов в какой-то момент. Там вы можете найти больше о диаграммах Вороного и их отношении к максимуму вписанных круги.

алгоритмы и реализаций.

вы действительно можете вычислить диаграмму Вороного. Наихудший алгоритм O(N log n) для точек и сегментов задается Fortune, алгоритм сканирующей для диаграмм Вороного, SoCG'86. Проведен опубликованный программный комплекс Vroni С ожидаемой сложностью времени O(n log n), которая фактически вычисляет максимальный вписанный круг. И, кажется, есть реализация в boost тоже.

для простых полигонов(т. е. без отверстий) оптимальный по времени алгоритм, который работает в O (n) времени, обусловлен Chin et al., Поиск медиальной оси простого многоугольника в линейном времени, 1999.

грубой силы.

однако, как вы заявили, что вы в порядке с алгоритмом грубой силы: как насчет просто опробовать все триплеты сайтов (вершины и ребра). Для каждого триплета вы найдете узлы кандидата Вороного, т. е. равноудаленные локусы к трем сайтам и проверьте, будет ли какой-либо другой сайт пересекать максимально вписанный круг кандидата. Если есть перекресток, вы увольняете кандидата. Возьмите наибольшее, что вы можете найти над всеми тройняшками.

см. Главу 3 в my магистерскую диссертацию подробнее о вычислении равноудаленных локусов для трех сайтов.


алгоритм O(N log X), где X зависит от требуемой точности.

двоичный поиск наибольшего радиуса R для круга:

на каждой итерации для заданного радиуса r нажмите каждый край E, "внутрь" на R, чтобы получить E'. Для каждого ребра E' определите полуплоскость H как множество всех точек" внутри "многоугольника (используя E' в качестве границы). Теперь вычислите пересечение всех этих полуплоскостей E', которое можно было бы сделать за O(n) время. Если пересечение не пустое, то если вы рисуете круг с радиусом r, используя любую точку пересечения в качестве центра, она будет внутри данного многоугольника.