222
правки
Изменения
м
graph buildVisibilityGraph(Set<Segment> segments) vertices = getVertices(segments) <tex> \cup\ \{S, T\} </tex> //все вершины препятствий, а также начальная и конечная вершины graph = visibilityGraph(vertices) //изначально в графе только вершины '''for''' Vertex v '''in''' vertices //для каждой вершины '''for''' Vertex w '''in''' getVisibleVertices(v, segments) //добавляем в граф все видимые из нее вершины visibilityGraph.addEdge(v, w) '''return''' visibilityGraph
Set<Vertex> getVisibleVertices(Vertex v, Set<Segment> segments) Set<Vertex> answer // Инициализируем статус '''for''' Segment s '''in''' segments '''if''' intersection s and ray from v to up exists status.add(s) // Инициализируем множество вершин, которые нужно рассматривать '''for''' Point w '''in''' segments '''if''' w.x >= v.x currentVertices.add(w) sort(currentVertices) by angle // Для каждой вершины проверяем, видима ли она и обновляем статус '''for''' Point w '''in''' currentVertices '''if''' intersection vw and status.closest not exists answer.add(w) delete from status all segments ending in w
→Псевдокод
===== Псевдокод =====
Здесь функция getVisibleVertices(<tex> v </tex>) возвращает все видимые из <tex> v </tex> вершины и выглядит так:
add in status all segments beginning in w
'''return''' answer