Тестирование того, является ли многоугольник простым или сложным

Для многоугольника, определенного как последовательность точек (x, y), как определить, сложна она или нет? Сложный многоугольник имеет пересечения с самим собой, как показано:

example complex polygon image

Есть ли лучшее решение, чем проверка каждой пары, которая имела бы временную сложность O (N 2)?

Ответ 1

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

Подробнее см. в этой статье, в частности, этот code to тест для простого полигона.

Ответ 2

См. Bentley Ottmann Algorithm для метода O ((N + I) log N) для развертки. Где N - количество сегментов линии, а я - количество точек пересечения.

Ответ 3

Фактически это можно сделать в линейном алгоритме триангуляции Chazelle с использованием времени. Он либо триангулирует многоугольник, либо обнаруживает, что многоугольник не прост.