Проверьте, является ли многоугольник Самопересекающимся

У меня есть система.Окна.Формы.Полигональный объект, компоновка которого полностью определяется рядом точек. Мне нужно определить, является ли этот многоугольник самопересекающимся; т. е. если какая-либо из сторон многоугольника пересекает любую из других сторон в точке, которая не является вершиной. Есть ли простой / быстрый способ вычислить это?

3 ответов


  • легкий, медленный, низкий объем памяти: сравните каждый сегмент со всеми другими и проверьте наличие пересечений. Сложность O (n2).

  • немного быстрее, средний объем памяти (модифицированная версия выше): храните ребра в пространственных "ведрах", затем выполните вышеуказанный алгоритм на основе каждого ведра. Сложность O (n2 / m) на m ведра (при условии равномерное распределение.)

  • быстрый и высокий объем памяти: используйте пространственную хэш-функцию для разделения ребер на ведра. Проверьте наличие столкновений. Сложность O (n).

  • быстрый и низкий объем памяти: используйте алгоритм развертки, такой как описанный здесь (или здесь). Сложность O (N log n)

последнее мое любимое как он имеет хороший баланс скорости и памяти, особенно Бентли-Оттман. Реализация также не слишком сложна.


проверьте, есть ли пара несмежные отрезков пересекается.


для полноты я добавляю еще один алгоритм к этому обсуждению.

предполагая, что читатель знает о выровненных по оси ограничениях (Google, если нет), может быть очень эффективно быстро найти пары ребер, у которых есть столкновение AABB, используя "алгоритм развертки и обрезки". (google it). Затем на этих парах вызываются процедуры пересечения.

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