Меня интересует сложность определения того, является ли данный непростой многоугольник почти простым, в любом из двух различных формальных значений: слабо простой или несамопересекающийся . Поскольку эти термины широко не известны, позвольте мне начать с некоторых определений.
Многоугольник представляет собой замкнутый цикл сегментов линии , соединяющий несколько конечной последовательность точек на плоскости. Точки называются вершинами многоугольника, а отрезки называются его ребрами . Мы можем указать любой многоугольник, просто перечислив его вершины по порядку.p 0 , p 1 , p 2 , … , p n - 1 p i
Многоугольник прост, если все вершин различны, а ребра пересекаются только в своих конечных точках. Эквивалентно, многоугольник прост, если он гомеоморфен окружности и каждое ребро имеет положительную длину. В общем, однако, вершины и ребра многоугольника могут пересекаться произвольно или даже совпадать. 1
Рассмотрим два многоугольных пути и , пересечение которых является общим подпутем обоих (возможно, одной точки). Мы говорим , что и B крест , если их конечные точки A (0), В (0), А (1), B (1) чередуются на границе окрестности общей подпути A \ B колпачком . Многоугольник является самопересекающимся, если он имеет два пересекающихся подпути, и не самопересекающимся в противном случае. 2
Многоугольник слабо прост, если он является пределом последовательности простых многоугольников, или эквивалентно, если существует сколь угодно малое возмущение вершин, которое делает многоугольник простым. Каждый слабо простой многоугольник не является самопересекающимся; однако некоторые несамопересекающиеся многоугольники не являются слабо простыми.
Например, рассмотрим шесть точек показанных ниже.
Многоугольник прост; см. левую фигуру.
Многоугольник слабо прост; средняя фигура показывает близлежащий простой многоугольник. Однако этот многоугольник не прост, потому что он посещает три раза.
Многоугольник является самопересекающимся, потому что подпути и пересекаются. Смотрите правильную фигуру для некоторой интуиции.b p q z y q p a
Наконец, многоугольник (который дважды обматывает средний многоугольник) не является самопересекающимся, но он не является слабо простым. Интуитивно понятно, что число поворотов этого многоугольника равно , тогда как число поворотов любого простого многоугольника должно быть . (Формальное доказательство требует некоторого анализа случая, отчасти потому, что число поворотов на самом деле не является четко определенным для многоугольников с углами!)± 2 ± 1 0 ∘
Обновление (13 сентября): на рисунке ниже многоугольник является самопересекающимся и имеет номер поворота 1 , но он не является слабо простым. Полигон, возможно, имеет несколько пересекающихся непростых подпространств , но он не имеет пересекающихся простых подпутей . (Я говорю «возможно», потому что неясно, как определить, когда две непростые прогулки пересекаются!)
Итак, наконец, вот мои актуальные вопросы:
Как быстро мы можем определить, является ли данный многоугольник несамопересекающимся?
Как быстро мы можем определить, является ли данный многоугольник слабо простым?
Первая задача может быть решена в раз следующим образом. Поскольку существует вершин, существует подпутей от вершины к вершине; мы можем проверить, прост ли какой-либо конкретный подпуть за времени (методом грубой силы). Для каждой пары простых подпутей от вершины к вершине мы можем проверить, пересекаются ли они за времени. Но это не может быть лучшим алгоритмом.n O ( n 2 ) O ( n 2 ) O ( n )
Я не знаю, может ли вторая проблема быть решена за полиномиальное время. Я думаю, что могу быстро вычислить четко определенное число поворотов для любого непростого многоугольника (если только объединение ребер многоугольника не является просто путем, и в этом случае многоугольник должен быть слабо простым); см. мой ответ ниже. Тем не менее, новый пример многоугольника, приведенный выше, подразумевает, что несамопересекающееся и поворачивающее число 1 не означает слабо простого.
Мы можем определить, является ли данный многоугольник простым за время, проверяя каждую пару ребер на предмет пересечения, или за время, используя стандартный алгоритм линии поворота, или даже за время используя алгоритм триангуляции Шазеля. (Если входной многоугольник не прост, любой алгоритм триангуляции либо выдаст исключение, бесконечный цикл, либо выдаст результат, который не является действительной триангуляцией.) Но ни один из этих алгоритмов не решает проблемы, о которых я спрашиваю. O ( n log n ) O ( n )
1 Бранко Грюнбаум. Полигоны: Мейстер был прав, а Пуансо был неправ, но победил . Beiträge zur Algebra und Geometrie 53 (1): 57–71, 2012.
2 См., Например: Эрик Д. Демейн и Джозеф О'Рурк. Алгоритмы геометрического сворачивания: связи, оригами, многогранники . Издательство Кембриджского университета, 2007.
Ответы:
Кажется, что первый вопрос имеет алгоритм (хотя это также, вероятно, не оптимально). Предполагая, что есть пересечение, ключ к его обнаружению, кажется, состоит в том, что ребра, которые должны быть найдены, это те, которые находятся непосредственно по обе стороны от общего подпути. Поэтому мы смотрим на все пары последовательных пар ребер. Есть квадратичное число из них. Если мы найдем пару пар ребер с вершинами и такими, что ребра и одинаковы, то мы проследим общий подпуть до конца и осмотрим ребра, которые его покидают. Если они образуют переход вместе с иa b c d e f b c e f a b d e O ( n 3 )O(n3) abc def bc ef ab de , тогда мы закончили, в противном случае мы переходим к следующей паре. Следование общему подпутю - это самое большее линейная операция, поэтому весь алгоритм равен .O(n3)
Этот анализ, вероятно, не является строгим, так как количество раз, когда будет следовать общий подпуть линейной длины, не является линейным по количеству пар пар. Там должно быть только постоянное количество таких. Точно так же, если длина самого длинного общего подпути постоянна, тогда мы в порядке с точки зрения количества времени после общих подпутей. Я ожидаю, что наихудший случай возникает, когда есть единственный подпуть длины , общий для подпутей. Тогда есть взаимодействий, и в каждом взаимодействии ребер следуют. Таким образом, даже если количество ребер, которые следуют, составляетO( √O(n−−√) O(n)O( √O(n−−√) O(n) o(n2)O(n2)O(n−−√) o(n2) и граница определяется количеством пар. Таким образом, я бы предположил, что истинная оценка для этого алгоритма .O(n2)
источник
По предложению Пэт Морин, вот моя идея вычислить число поворотов. Извините, если это немного небрежно; Я все еще сражаюсь с нотациями демонов. Более того, комментарий Пэт к ответу Криса показывает, что я проигнорировал некоторые важные вырожденные случаи. Но я все равно опубликую это здесь на тот случай, если другие найдут это полезным.
Для любого индекса пусть обозначает внешний угол со в вершине ; это угол против часовой стрелки между лучами и , нормализованный к диапазону . (Все индекс арифметика неявно по модулю ) . В поворачивая число из определяется как Позвольте мне назвать вершиной шпоры , если внутренний уголi θ(pi)=θ(pi−1,pi,pi+1) pi pi−1pi−→−− pipi+1−→−− −π≤θi≤π n P
Теперь предположим, что содержит вида , где и путь является обращением путь . Тогда - шпора; Вызов на корень из . В этом случае позвольте мне определить внешний угол в точке следующим образом: (но что, еслиP p→r⇝s⇝r→q p≠q r⇝s s⇝r s r s s
Если слабо прост, то существует простой -gon произвольно близкий к ; Tet будет вершиной ближе всего к . Когда приближается к , внутренний угол в приближается к нулю. Нетрудно доказать (по индукции по длине ), что внешний угол приближается к .P n P~ P s~ P~ P P~ P s~ r⇝s θ(s~) θ~(s)
Если целиком состоит из за которым следует его обращение, , то внешние углы на отрогах и все еще не определены четко. Но в этом случае я считаю, что слабо проста тогда и только тогда, когда прогулка является самопересекающейся. (Есть более сложные случаи, когда я не могу определить разумное модифицированное число поворотов, в частности, если многоугольник бродит взад и вперед через одну прогулку. Но во всех таких случаях оказывается, что многоугольник слабо прост тогда и только тогда, когда он не является самопересекающимся.)P r⇝s⇝r r s P r⇝s
В противном случае, если мы определим для любой невозрожденной вершины , теперь у нас есть четко определенный номер поворота , который должен быть если слабо прост.ря ~ Т у г п (Р)=Σя ~ θ (ря)/2π=Тугл( ~ Р )±1Рθ~(pi)=θ(pi) pi Turn˜(P)=∑iθ~(pi)/2π=Turn(P~) ±1 P
Я больше не уверен, что можно вычислить за линейное время. Основная трудность заключается в том, что прогулка само по себе может содержать шпоры. Наивный алгоритм, который находит корень каждой шпоры грубой силой, на самом деле в худшем случае занимает время; рассмотрим -гон, имеющий подволок длины который просто чередуется между двумя точками.r⇝sΘ(n2)nΩ(n)Turn˜(P) r⇝s Θ(n2) n Ω(n)
источник