Пересечение многоугольников (PSLG overlaying) — различия между версиями
Tiss93 (обсуждение | вклад) |
Tiss93 (обсуждение | вклад) |
||
| Строка 25: | Строка 25: | ||
6. Для каждой компоненты графа: | 6. Для каждой компоненты графа: | ||
| − | 7. Пусть <tex> | + | 7. Пусть <tex>C</tex> будет уникальная наружная граница цикла в компоненте, а <tex>f</tex> будет означать face ограниченный этим циклом. Создадим face для <tex>f</tex>. Запишем outer_component в какой-нибудь half-edge из <tex>C</tex>. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на <tex>f</tex>. |
==Q&A== | ==Q&A== | ||
Версия 22:44, 7 января 2014
Вычисление пересечения двух многоугольников представленных в виде РСДС
Алгоритм
MapOverlay (, ) Дано: 2 ППЛГ в виде РСДС. Вывод: пересечение этих ППЛГ в виде РСДС. Алгоритм: 1. Копируем и в РСДС .
2. Находим все пересечения ребер из с ребрами из с помощью заметающей прямой.
2.1 Когда находим точки пересечения, то обновляем .
2.2 Сохраняем half-edge слева от event point в vertex, содержащемся в .
3. Теперь это нормальный РСДС, но без информации о faces.
4. Находим boundary cycles в .
5. Создаем граф , в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).
6. Для каждой компоненты графа:
7. Пусть будет уникальная наружная граница цикла в компоненте, а будет означать face ограниченный этим циклом. Создадим face для . Запишем outer_component в какой-нибудь half-edge из . И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на .