Kürzeste Wege und der visibility Graph

Werbung
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 ]
Herunterladen