222
правки
Изменения
→Построение РСДС множества прямых
==Построение РСДС множества прямых==
Будем добавлять прямые по одной. Изначально у нас есть фэйс, который представляет собой всю плоскость. Алгоритм будет такой: * Локализовать рандомную точку прямой в face* Найти half-edge'и, которые пересекает эта прямая(их будет не больше 2, если считать что пересечение в точке за одно ребро)* Разбить текущий face на два face1 и face2** Если пересечение не в точке, разбиваем ребра на два {{---}} a, b и c, d, так как пересечения два** Создаем два half-edge {{---}} отрезок прямой, попадающий в фэйс** <pre>half_edge1->origin = intersection_line_and_edge1;half_edge2->origin = intersection_line_and_edge2; half_edge1->twin = half_edge2;half_edge2->twin = half_edge1;half_edge1->incident_face = face1;half_edge2->incident_face = face2; half_edge1->next = a;a->prev = half_edge1;half_edge1->prev = c;c->next = half_edge1; half_edge2->next = b;b->prev = half_edge2;half_edge2->prev = d;d->next = half_edge2;</pre>** Не забываем поменять у half-edgeй исходного face поле incident_face на face1 и face2 соответственно* Мы знаем куда(в какие фэйсы {{---}} edge->twin->incident_face) пошла наша прямая. Запускаемся от них и разбиваем их аналогично. Если пересечение было в точке, перебираем faceы(next_face = edge->prev->twin->incident_face), пока не найдем нужный. Если фэйс бесконечный {{---}} идем только в одну сторону ==См. также==[http://cs.stackexchange.com/a/18167 Более поясняющая статья.] К сожалению нет времени перевести, но там и так все достаточно понятно.