Максимальный вписанный круг в многоугольниках. Классическое решение вычислительной геометрии для задачи с максимальным вписанным кружком для полигонов заключается в использовании граней, medial axis многоугольника. Этот подход работает в более общем виде, таком как полигоны с отверстиями, см. Этот вопрос stackoverflow answer.
Выпуклый ввод. Выпуклость вашего входного многоугольника, однако, придает проблеме больше структуры, о которой я бы хотел прокомментировать. Рассмотрим следующий выпуклый входной многоугольник (черный), диаграмму Вороного (синий) и максимальный вписанный круг (зеленый), центрированный на узле Вороного.

Классическое решение Вороной на основе состоит в (I) вычислить диаграмму Вороной и (б) принимают узел Вороного с самым большим зазором (то есть, расстоянием до ее определяющих граней).
Диаграмма Вороного с многоугольником с отверстиями (т. Е. Множество вершин и ребер) может быть вычислена в O (n log n) time, c.f. Fortune's algorithm (1986).Позже Chin et alii (1999) дал алгоритм O (n) для медиальной оси простого многоугольника.
Для выпуклых многоугольников, однако, время-оптимального алгоритм для диаграммы Вороного, которая работает в O (N) время было известно уже в 1989 году из-за Aggarwal et alii. Этот алгоритм следует в основном следующей идеей: Рассмотрим кривые смещения серого, движущиеся внутрь с единичной скоростью. Если спроецировать это движение в трехмерном пространстве, где ось г время вы получите блок-отстойные крышу над полигоном:

Эта модель крыши также можно охарактеризовать следующим образом: Поместите половинным пространство на каждом краю многоугольника при наклоне 45 ° с полигоном (таким образом, что они содержат многоугольник) и пересекают их все. Поэтому, если вы можете быстро вычислить пересечение полупространств, вы также можете быстро вычислить диаграммы Вороного выпуклых многоугольников. На самом деле, для максимальной задачи с вписанным кружком нам не нужно возвращаться к диаграмме Вороного, но возьмите один пик крыши, который обозначает центр максимальной вписанной окружности.
Теперь полупространства дуализированы точками, а затем пересечение полупространств соответствует выпуклой оболочке его двойственных точек. Aggarwal et al. теперь нашел алгоритм O (n) для выпуклой оболочки точек, вытекающих из этой настройки.
Краткое описание этой конструкции, которая приводит к алгоритму диаграммы Вороного для выпуклых многогранников в любой размерности, может быть найдена в шахте blog article.
Простой & Быстрая реализация. Более простой алгоритм вычисления диаграммы Вороного мотивирован straight skeletons. Для выпуклых многоугольников диаграмма Вороного и прямой скелет совпадают.
Алгоритм реализации прямого скелета Stalgo в основном имитирует эволюцию структуры волнового фронта (кривые серого смещения). Для выпуклых многоугольников это сводится к нахождению последовательности краев.
Так простой O (п журнал п) алгоритм может выглядеть следующим образом:
- Построить круговую список полигонов. Вычислите время срыва каждого края во время распространения волнового фронта и вставьте это событие в очередь приоритетов.
- Пока очередь не пуста: выведите следующее событие с краем: удалите край из круговой структуры и обновите времена срыва соседних краев удаленного края.
На самом деле, вы можете упростить описанный выше алгоритм: вам не нужно обновлять обрывы краев в очереди приоритетов, но просто вставлять новые: поскольку новое время краха ребер строго ниже, вы всегда получаете право сначала, и отпустите остальных, а очередь не станет больше 2n. Следовательно, вы не ставите под угрозу сложность времени O (n log n).
Для решения проблемы с максимальной вписанной окружностью вы можете упростить описанный выше алгоритм: узел Voronoi (прямой узел скелета), который вы ищете, связан с крахом конечного треугольника в конце цикла над приоритетом очередь.
Этот алгоритм должен быть быстрым на практике и всего несколькими строками кода.
Пожалуйста, перечитайте начало этого потока, это касается другой проблемы, так что нормально, что ответ не тот же ... Вы хотите, чтобы диск не пересекал многоугольник, в то время как этот поток о поиске диска, который не содержит ни одной из ** вершин ** (без упоминания ребер). –
@MarcGlisse Спасибо за ваш ответ. Я снова перечитываю поток, поэтому проблема «большого пустого круга» не рассматривает ребра? Я увидел, что naresh упомянул, что он хотел найти самый большой вписанный круг, но так как он использует точки, а не полигональные вершины, поэтому я не могу использовать этот алгоритм. У вас есть идея решить эту проблему? – Linda
Вероятно, вы должны задать вопрос в новом вопросе. Но сначала попробуйте понять структуру проблемы. У вас есть n строк, и для каждой строки вы хотите, чтобы круг находился на данной стороне этой линии. Можете ли вы сформулировать это как линейную программу? –