Пересечение многоугольников (PSLG overlaying) — различия между версиями
Tiss93 (обсуждение | вклад) |
Tiss93 (обсуждение | вклад) |
||
Строка 4: | Строка 4: | ||
[[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]] | [[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]] | ||
− | + | ==Алгоритм== | |
− | MapOverlay ( | + | MapOverlay (<tex>S_1</tex>, <tex>S_2</tex>) |
Дано: 2 ППЛГ в виде РСДС. | Дано: 2 ППЛГ в виде РСДС. | ||
Вывод: пересечение этих ППЛГ в виде РСДС. | Вывод: пересечение этих ППЛГ в виде РСДС. | ||
Алгоритм: | Алгоритм: | ||
− | 1. Копируем | + | 1. Копируем <tex>S_1</tex> и <tex>S_2</tex> в РСДС <tex>D</tex>. |
− | 2. Находим все пересечения ребер из | + | 2. Находим все пересечения ребер из <tex>S_1</tex> с ребрами из <tex>S_2</tex> с помощью заметающей прямой. |
− | 2.1 Когда находим точки пересечения, то обновляем D. | + | 2.1 Когда находим точки пересечения, то обновляем <tex>D</tex>. |
− | 2.2 Сохраняем half-edge слева от event point в vertex, содержащемся в D. | + | 2.2 Сохраняем half-edge слева от event point в vertex, содержащемся в <tex>D</tex>. |
− | 3. Теперь D это нормальный РСДС, но без информации о faces. | + | 3. Теперь <tex>D</tex> это нормальный РСДС, но без информации о faces. |
− | 4. Находим boundary cycles в D. | + | 4. Находим boundary cycles в <tex>D</tex>. |
− | 5. Создаем граф G, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим). | + | 5. Создаем граф <tex>G</tex>, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим). |
6. Для каждой компоненты графа: | 6. Для каждой компоненты графа: | ||
− | 7. Пусть С будет уникальная наружная граница цикла в компоненте, а f будет означать face ограниченный этим циклом. Создадим face для f. Запишем outer_component в какой-нибудь half-edge из C. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на f. | + | 7. Пусть <tex>С</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:43, 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 будут обновлены на .