Kürzeste Wege und der visibility Graph Sei S eine Menge disjunkter einfacher Polygone mit insgesamt n Eckpunkten. Seien pstart und pgoal zwei Punkte außerhalb der Polygone. Berechnet werden soll ein kürzester Weg von pstart nach pgoal der keines der Polygone in S schneidet. ShortestPath(S, pstart , pgoal ) 1 2 3 Gvis ← VisibilityGraph(S ∪ {pstart , pgoal }) for alle Kanten (u, v) in Gvis do d(u, v) ← Länge des Linensegments uv Berechne kürzesten Weg von pstart nach pgoal in (Gvis , d) mit dem Dijkstra-Algorithmus VisibilityGraph(S) 1 2 3 4 5 6 V ← alle Knoten in S E←∅ for all v ∈ V do W ← VisibleVertices(v, S) for all w ∈ W do E ← E ∪ (v, w) return G = (V, E) VisibleVertices(p, S) 1 2 3 4 5 6 7 8 9 10 (w1 , w2 , . . . , wn ) ← sortierte Folge der Knoten von S im Kreis um p im Uhrzeigersinn ρ ← Halbgerade von p aus horizontal nach rechts T ← Suchbaum mit den Kanten von S die ρ schneiden von links nach rechts W ←∅ for i ← 1 to n do if Visible(wi ) then W ← W ∪ wi ρ ← Halbgerade von p aus durch wi Füge in T die Kanten mit Endpunkt wi ein die in Uhrzeigerrichtung vor ρ liegen Lösche aus T die Kanten mit Endpunkt wi die in Uhrzeigerrichtung hinter ρ liegen return W Visible(wi ) 1 2 3 4 5 if pwi schneidet das Innere des Polygons von wi lokal bei wi then return False if i = 1 or wi−1 6∈ pwi then return [ T = ∅ or die Kante ganz links in T schneidet pwi nicht ] else if wi−1 ist nicht sichtbar then return False return [ keine Kante in T schneidet wi−1 wi ]