Обнаружение двух видов почти простых полигонов

22

Меня интересует сложность определения того, является ли данный непростой многоугольник почти простым, в любом из двух различных формальных значений: слабо простой или несамопересекающийся . Поскольку эти термины широко не известны, позвольте мне начать с некоторых определений.

  • Многоугольник представляет собой замкнутый цикл сегментов линии , соединяющий несколько конечной последовательность точек на плоскости. Точки называются вершинами многоугольника, а отрезки называются его ребрами . Мы можем указать любой многоугольник, просто перечислив его вершины по порядку.p 0 , p 1 , p 2 , , p n - 1 p iPp0,p1,p2,,pn1pipipi+1modn

  • Многоугольник прост, если все n вершин различны, а ребра пересекаются только в своих конечных точках. Эквивалентно, многоугольник прост, если он гомеоморфен окружности и каждое ребро имеет положительную длину. В общем, однако, вершины и ребра многоугольника могут пересекаться произвольно или даже совпадать. 1

  • Рассмотрим два многоугольных пути A и B , пересечение которых является общим подпутем обоих (возможно, одной точки). Мы говорим , что и B крест , если их конечные точки A (0), В (0), А (1), B (1) чередуются на границе окрестности общей подпути A \ B колпачком . Многоугольник является самопересекающимся, если он имеет два пересекающихся подпути, и не самопересекающимся в противном случае. 2AB A(0),B(0),A(1),B(1)AB

  • Многоугольник слабо прост, если он является пределом последовательности простых многоугольников, или эквивалентно, если существует сколь угодно малое возмущение вершин, которое делает многоугольник простым. Каждый слабо простой многоугольник не является самопересекающимся; однако некоторые несамопересекающиеся многоугольники не являются слабо простыми.

Например, рассмотрим шесть точек a,b,p,q,x,y показанных ниже.

введите описание изображения здесь

  • Многоугольник abpqyz прост; см. левую фигуру.

  • Многоугольник papbpqyqzq слабо прост; средняя фигура показывает близлежащий простой многоугольник. Однако этот многоугольник не прост, потому что он посещает p три раза.

  • Многоугольник является самопересекающимся, потому что подпути и пересекаются. Смотрите правильную фигуру для некоторой интуиции.b p q z y q p apapbpqzqyqbpqzyqpa

  • Наконец, многоугольник (который дважды обматывает средний многоугольник) не является самопересекающимся, но он не является слабо простым. Интуитивно понятно, что число поворотов этого многоугольника равно , тогда как число поворотов любого простого многоугольника должно быть . (Формальное доказательство требует некоторого анализа случая, отчасти потому, что число поворотов на самом деле не является четко определенным для многоугольников с углами!)± 2 ± 1 0 papbpqyqzqpapbpqyqzq±2±10

Обновление (13 сентября): на рисунке ниже многоугольник является самопересекающимся и имеет номер поворота 1 , но он не является слабо простым. Полигон, возможно, имеет несколько пересекающихся непростых подпространств , но он не имеет пересекающихся простых подпутей . (Я говорю «возможно», потому что неясно, как определить, когда две непростые прогулки пересекаются!)abcabcxyzxpqrxzyx

введите описание изображения здесь

Итак, наконец, вот мои актуальные вопросы:

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

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

Первая задача может быть решена в раз следующим образом. Поскольку существует вершин, существует подпутей от вершины к вершине; мы можем проверить, прост ли какой-либо конкретный подпуть за времени (методом грубой силы). Для каждой пары простых подпутей от вершины к вершине мы можем проверить, пересекаются ли они за времени. Но это не может быть лучшим алгоритмом.n O ( n 2 ) O ( n 2 ) O ( n )O(n5)nO(n2)O(n2)O(n)

Я не знаю, может ли вторая проблема быть решена за полиномиальное время. Я думаю, что могу быстро вычислить четко определенное число поворотов для любого непростого многоугольника (если только объединение ребер многоугольника не является просто путем, и в этом случае многоугольник должен быть слабо простым); см. мой ответ ниже. Тем не менее, новый пример многоугольника, приведенный выше, подразумевает, что несамопересекающееся и поворачивающее число 1 не означает слабо простого.

Мы можем определить, является ли данный многоугольник простым за время, проверяя каждую пару ребер на предмет пересечения, или за время, используя стандартный алгоритм линии поворота, или даже за время используя алгоритм триангуляции Шазеля. (Если входной многоугольник не прост, любой алгоритм триангуляции либо выдаст исключение, бесконечный цикл, либо выдаст результат, который не является действительной триангуляцией.) Но ни один из этих алгоритмов не решает проблемы, о которых я спрашиваю. O ( n log n ) O ( n )O(n2)O(nlogn)O(n)


1 Бранко Грюнбаум. Полигоны: Мейстер был прав, а Пуансо был неправ, но победил . Beiträge zur Algebra und Geometrie 53 (1): 57–71, 2012.

2 См., Например: Эрик Д. Демейн и Джозеф О'Рурк. Алгоритмы геометрического сворачивания: связи, оригами, многогранники . Издательство Кембриджского университета, 2007.

Jeffε
источник
Я не понимаю, почему кто-то проголосовал бы за этот вопрос ?!
Каве
Возможно, я совершенно неправильно понимаю вопрос, и поэтому, возможно, это далеко, но мне кажется, что способ подсчета вершин означает, что второй вопрос обязательно занимает экспоненциальное время. Позвольте мне объяснить: в вашем последнем примере вы используете одни и те же вершины несколько раз. Кажется, легко построить графы с экспоненциальным числом уникальных циклов.
Джо Фицсимонс
Если ваш ввод является полигоном, заданным, как в ваших примерах, то вход может быть экспоненциальным по числу вершин без повторения цикла. Если график содержит ваш примерный график (2 и 3) в качестве подграфа, то он имеет циклы, которые не пересекаются, и циклы, которые пересекаются. В результате вам необходимо прочитать всю строку, чтобы убедиться, что у вас нет циклов пересечения (которые могли или не могли быть включены). В худшем случае это занимает экспоненциальное время по . n
Джо Фицсимонс
1
@JoeFitzsimons: входные данные - это просто последовательность точек (т. Е. Пар вещественных чисел), которые не обязательно должны различаться. Размер ввода - это длина этой последовательности, а не количество уникальных точек. n
Джеффс
2
@Kaveh: Может быть, слишком абстрактный / специализированный? Слишком много слов? Я должен был назвать точки Ga, Ka, Naa, Taa, Tin, Khat ?
Джеффс

Ответы:

2

Кажется, что первый вопрос имеет алгоритм (хотя это также, вероятно, не оптимально). Предполагая, что есть пересечение, ключ к его обнаружению, кажется, состоит в том, что ребра, которые должны быть найдены, это те, которые находятся непосредственно по обе стороны от общего подпути. Поэтому мы смотрим на все пары последовательных пар ребер. Есть квадратичное число из них. Если мы найдем пару пар ребер с вершинами и такими, что ребра и одинаковы, то мы проследим общий подпуть до конца и осмотрим ребра, которые его покидают. Если они образуют переход вместе с иa b c d e f b c e f a b d e O ( n 3 )O(n3)abcdefbcefabde, тогда мы закончили, в противном случае мы переходим к следующей паре. Следование общему подпутю - это самое большее линейная операция, поэтому весь алгоритм равен .O(n3)

Этот анализ, вероятно, не является строгим, так как количество раз, когда будет следовать общий подпуть линейной длины, не является линейным по количеству пар пар. Там должно быть только постоянное количество таких. Точно так же, если длина самого длинного общего подпути постоянна, тогда мы в порядке с точки зрения количества времени после общих подпутей. Я ожидаю, что наихудший случай возникает, когда есть единственный подпуть длины , общий для подпутей. Тогда есть взаимодействий, и в каждом взаимодействии ребер следуют. Таким образом, даже если количество ребер, которые следуют, составляетO(O(n)O(n)O(O(n)O(n)o(n2)O(n2)O(n)o(n2)и граница определяется количеством пар. Таким образом, я бы предположил, что истинная оценка для этого алгоритма .O(n2)

Крис Грей
источник
1
«Следование общему подпутю - это самое большее линейная операция времени». Это правда? Помните, что подпути не идентичны. Один может складываться взад-вперед вдоль изображения другого. На самом деле, это даже не ясно (для меня), когда вы знаете, что вы сделали.
Пэт Морин
Хорошая точка зрения. Возможно ли в качестве шага предварительной обработки привести многоугольник в какую-то стандартную форму? Мы выберем пути, которые немедленно свернутся сами по себе, а также вершины, которые коллинеарны с их непосредственными соседями. Тогда предложение, которое вы процитировали, было бы лучше определено - общий подпуть состоит из ребер, имеющих одинаковые вершины, и вы знаете, что все готово, потому что вы попали в разные вершины. Доказательство того, что ответ остается неизменным в многоугольнике в стандартной форме, не должно быть слишком сложным.
Крис Грей,
@ChrisGray: Возможно, но не так легко, как вы предлагали. Если образ является деревом, то рекурсивное исключение всех обратных переключений в конечном итоге сводит к одной точке. ПPP
Джефф
Да, вы правы, эта идея не сработает. Самая правая цифра, которую вы дали выше, будет сведена к одной точке.
Крис Грей
Я планирую, чтобы срок действия награды истек; половина баллов будет автоматически присуждена за этот ответ.
Джефф
2

По предложению Пэт Морин, вот моя идея вычислить число поворотов. Извините, если это немного небрежно; Я все еще сражаюсь с нотациями демонов. Более того, комментарий Пэт к ответу Криса показывает, что я проигнорировал некоторые важные вырожденные случаи. Но я все равно опубликую это здесь на тот случай, если другие найдут это полезным.

Для любого индекса пусть обозначает внешний угол со в вершине ; это угол против часовой стрелки между лучами и , нормализованный к диапазону . (Все индекс арифметика неявно по модулю ) . В поворачивая число из определяется как Позвольте мне назвать вершиной шпоры , если внутренний уголiθ(pi)=θ(pi1,pi,pi+1)pipi1pipipi+1πθiπnP

Turn(P)=12πi=0n1θ(pi).
pipi равно . Внешний угол в отроге не является четко определенным; это может быть либо либо . В более общем смысле число поворотов корректно определено тогда и только тогда, когда у нет шпор (и нет повторяющихся вершин ). Нетрудно доказать, что является целым числом, если оно хорошо определено; в частности, если простой многоугольник.0θiππPPpi=pi+1Turn(P)Turn(P)=±1P

Теперь предположим, что содержит вида , где и путь является обращением путь . Тогда - шпора; Вызов на корень из . В этом случае позвольте мне определить внешний угол в точке следующим образом: (но что, еслиPprsrqpqrssrsrss

θ~(s)=πsgnθ(p,r,q)={πif θ(p,r,q)>0πif θ(p,r,q)<0
θ(p,r,q)=0? Как замечает Пэт, это действительно может произойти. Возможно, есть какой-то рекурсивный способ определения даже в этом случае, но я не знаю, что это такое.)θ~(s)

Если слабо прост, то существует простой -gon произвольно близкий к ; Tet будет вершиной ближе всего к . Когда приближается к , внутренний угол в приближается к нулю. Нетрудно доказать (по индукции по длине ), что внешний угол приближается к .PnP~Ps~P~PP~Ps~rsθ(s~)θ~(s)

Если целиком состоит из за которым следует его обращение, , то внешние углы на отрогах и все еще не определены четко. Но в этом случае я считаю, что слабо проста тогда и только тогда, когда прогулка является самопересекающейся. (Есть более сложные случаи, когда я не могу определить разумное модифицированное число поворотов, в частности, если многоугольник бродит взад и вперед через одну прогулку. Но во всех таких случаях оказывается, что многоугольник слабо прост тогда и только тогда, когда он не является самопересекающимся.)PrsrrsPrs

В противном случае, если мы определим для любой невозрожденной вершины , теперь у нас есть четко определенный номер поворота , который должен быть если слабо прост.ря ~ Т у г п (Р)=Σя ~ θ (ря)/2π=Тугл( ~ Р )±1Рθ~(pi)=θ(pi)piTurn~(P)=iθ~(pi)/2π=Turn(P~)±1P

Я больше не уверен, что можно вычислить за линейное время. Основная трудность заключается в том, что прогулка само по себе может содержать шпоры. Наивный алгоритм, который находит корень каждой шпоры грубой силой, на самом деле в худшем случае занимает время; рассмотрим -гон, имеющий подволок длины который просто чередуется между двумя точками.rsΘ(n2)nΩ(n)Turn~(P)rsΘ(n2)nΩ(n)

Jeffε
источник