Резюме: Теоретически это можно сделать за O (n) раз.На практике вы можете сделать это за O (n log n) времени.
Обобщенные диаграммы Вороного.
Если вы рассматриваете вершины и ребра многоугольника как множествосайтов и тесселяции интерьера в «ячейки ближайших соседей», тогда вы получите так называемую (обобщенную) диаграмму Вороного.Диаграмма Вороного состоит из узлов и ребер, соединяющих их. зазор узла - это расстояние до его определяющих граней многоугольника.
(Здесь у многоугольника даже есть отверстия; принцип все еще работает.)
Ключевое наблюдение теперь заключается в том, что центр максимального вписанного круга касается трех граней (вершин или ребер) многоугольника, и никакая другая грань не можетбыть ближеТаким образом, центр должен лежать на узле Вороного, то есть на узле с наибольшим зазором.
В приведенном выше примере узел, отмечающий центр максимального вписанного круга, касается двух ребер и вершины многоугольника..
Между прочим, медиальная ось - это диаграмма Вороного с удаленными ребрами Вороного, исходящими из рефлекторных вершин.Следовательно, центр максимального вписанного круга также лежит на средней оси.
Источник: моя статья в блоге , в которой рассматриваются обобщения максимальных вписанных кругов в некоторой точке.Там вы можете найти больше информации о диаграммах Вороного и их отношении к максимальным вписанным кружкам.
Алгоритмы и реализации.
Вы могли бы фактически вычислить диаграмму Вороного.Алгоритм O (n log n) для наихудшего случая для точек и отрезков дан Fortune, Алгоритм развертки для диаграмм Вороного , SoCG'86.Хелд опубликовал программный пакет Vroni с ожидаемой O (n log n) временной сложностью, который фактически вычисляет также максимальный вписанный круг.И, кажется, также есть реализация в boost .
Для простых полигонов (т. Е. Без дырок) оптимальный по времени алгоритм, который выполняется за O (n), обусловлен Чиноми др., Нахождение средней оси простого многоугольника за линейное время , 1999.
Грубая сила.
Однако, как вы заявили, что у вас все в порядке с алгоритмом грубой силы: как насчет простой проверки всех триплетов сайтов (вершин и ребер).Для каждого триплета вы находите подходящие узлы Вороного, то есть эквидистантные локусы к трем сайтам, и проверяете, пересекает ли какой-либо другой сайт максимально допустимый вписанный круг.Если есть пересечение, вы увольняете кандидата.Возьмите самое лучшее, что вы можете найти во всех триплетах.
См. Главу 3 в моей Магистерской диссертации , чтобы узнать больше о вычислении эквидистантных локусов для трех сайтов.