Schnitte von Liniensegmenten

Werbung
Schnitte von Liniensegmenten
Gegeben ist eine Menge S von n Liniensegmenten im R2 . Ein Liniensegment ist dabei durch
seine zwei Endpunkte gegeben. Es sollen alle Schnittpunkte der Liniensegmente berechnet
werden. Mit einem Schnittpunkt p geben wir auch alle Liniensegmente aus, die sich in p
schneiden.
Datenstrukturen Ereignispunkte (event points) sind die Endpunkte der Liniensegmente
und die im Laufe des Berechnung gefundenen Schnittpunkte. Ereignispunkte werden in einer
event queue Q gespeichert, einem balancierten Suchbaum. Die Ordnung ≺ auf den Punkten
ist dabei von oben nach unten definiert: für Punkte p = (px , py ) und q = (qx , qy ) ist
p≺q
falls py > qy , oder py = qy und px < qx .
Bei einem horizontalen Liniensegment kommt also der linke Endpunkt zuerst und wir betrachten ihn damit als den oberen Endpunkt.
Mit jedem Punkt p wird eine Menge U (p) (als Liste) gespeichert, die die Liniensegmente
enthält, bei denen p oberer Endpunkt ist.
Wir führen eine horizontale Gerade, die sweep line, über die Liniensegmente. Die Liniensegmente, die aktuell die sweep line schneiden, werden in einem balancierten Suchbaum T
gespeichert. Die Ordnung wird dabei durch aufsteigende x-Werte der Schnittpunkte der Liniensegmente mit der sweep line definiert. Haben mehrere Schnittpunkte den gleichen x-Wert,
so wird die Ordnung durch die Lage unmittelbar unterhalb der sweep line definiert.
Line-Segment-Intersection(S)
1 T ←∅
2 Q←∅
3 Füge alle Endpunkte p der Liniensegmente in Q ein, zusammen mit U (p),
der Menge der Liniensegmente, bei denen p oberer Endpunkt ist.
4 while Q 6= ∅ do
5
p ← Extract-Min(Q)
6
suche alle Liniensegmente in T , die p enthalten. Diese sind in T benachbart.
Sei L(p) die Menge der Liniensegmente, bei denen p unterer Endpunkt ist und
C(p) die Menge der Liniensegmente, bei denen p innerer Punkt ist.
7
if |L(p) ∪ C(p) ∪ U (p)| > 1 then output p, L(p), C(p), U (p)
8
Delete (L(p) ∪ C(p), T )
9
Insert (U (p) ∪ C(p), T )
(∗ Löschen und wieder einfügen der Segmente von C(p) dreht deren Reihenfolge in T um ∗)
10
if U (p) ∪ C(p) = ∅
11
then (∗ p ist aussschließlich unterer Endpunkt von ≥ 1 Liniensegmenten ∗)
12
berechne linken und rechten Nachbarn sl und sr der Liniensegmente von p in T .
13
if sl und sr existieren then Find-New-Event(sl , sr , p)
14
else (∗ p ist oberer Endpunkt oder Schnittpunkt von Liniensegmenten ∗)
15
berechne das am weitesten links liegende Liniensegment s0 von U (p) ∪ C(p) in T
16
berechne den linken Nachbar sl von s0 in T
17
if sl existiert then Find-New-Event(sl , s0 , p)
18
berechne das am weitesten rechts liegende Liniensegment s00 von U (p) ∪ C(p) in T
19
berechne den rechten Nachbar sr von s00 in T
20
if sr existiert then Find-New-Event(s00 , sr , p)
Find-New-Event(sl , sr , p)
1 if sl und sr schneiden sich in x, x 6∈ Q und p ≺ x then Insert(x, Q)
Herunterladen