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)