прямолинейное пересечение многоугольников - PullRequest
8 голосов
/ 21 мая 2011

Я ищу / пытаюсь разработать оптимальный алгоритм для прямолинейного многоугольника пересечения с прямоугольниками. У полигонов, которые я тестирую, нет дыр.

Ответы, подобные приведенным здесь и здесь , предназначены для очень общих многоугольников, и решения вполне понятны.

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

Я ищу многоугольник зеленого цвета на изображении ниже:

rectilinear polygon intersection with a rectangle

Ответы [ 2 ]

2 голосов
/ 21 мая 2011

Книга Вычислительная геометрия: введение Препарата и Шамоса содержит главу о прямолинейных многоугольниках.

1 голос
/ 23 мая 2011

Используйте алгоритм строчной линии, используя тот факт, что прямолинейный многоугольник определяется его вершинами.

Представляет вершины вместе с прямоугольником, которому они принадлежат, то есть что-то вроде (x, y, #rect). К этому набору точек добавьте те точки, которые являются результатом пересечений всех ребер. Эти новые точки имеют вид (x, y, final), поскольку мы уже знаем, что они принадлежат результирующему набору точек.

Сейчас:

  • отсортировать все точки по их x-значению
  • использовать линию развертки, начиная с первой x-координаты; для каждой новой точки:
    • если это «начальная точка», добавьте ее во временный набор T. Отметьте его как «окончательный», если это точка из прямоугольника A и между y-координатами из точек из прямоугольника B в T (или наоборот).
    • если это «конечная точка», удалите ее и соответствующую ей начальную точку из T.

После этого все точки, помеченные как «окончательные», обозначают вершины результирующего многоугольника.

Пусть N - общее количество баллов. Далее, предполагая, что проверка того, должны ли мы отмечать точку как «конечную», занимает время O (log (n)) путем поиска T, весь этот алгоритм находится в O (N * log (N)).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...