3.1 Motivation
Geoinformationssysteme (Folien 3–6)
In einem GIS liegen Informationen in Ebenen (Layern) übereinander: Straßen, Flüsse, Bahnlinien, Orte. Will man z.B. alle Brücken finden, legt man die Layer „Straßen“ und „Flüsse“ übereinander und sucht alle Kreuzungen.
- Straßen und Flüsse werden durch Polygonzüge angenähert.
- Gesucht sind also Schnittpunkte von Liniensegmenten.
- Wer naiv jede Straße gegen jeden Fluss testet, überfordert das System schnell, weil Karten sehr viele Segmente haben.
Vereinfachung: Statt Polygonzügen betrachtet man nur einzelne Liniensegmente.
Vorgehen (Folie 6):
- Alle Segmente aller Polygonzüge in eine Menge werfen und alle Schnitte berechnen.
- Danach sortieren, welche Schnitte zu welchen Polygonzügen gehören.
- Achtung: Zwei aufeinanderfolgende Segmente desselben Polygonzugs berühren sich immer in ihrem gemeinsamen Endpunkt. Dieser „Schnitt“ ist kein echter Schnitt. Ein echter Schnitt kann aber zufällig genau auf so einem Endpunkt liegen und muss dann trotzdem erkannt werden.
3.2 Naiver Ansatz (Folie 8)
| Eingabe | Menge von Strecken in der Ebene |
| Ziel | alle Schnittpunkte von Strecken aus |
| Lösung | alle Paare testen, bei Schnitt den Schnittpunkt ausgeben |
| Laufzeit |
Ist das schlecht? Kommt drauf an:
- Wenn sich alle Paare schneiden, gibt es Schnittpunkte. Allein die Ausgabe kostet dann , und der naive Algorithmus ist optimal.
- In der Praxis (Karten!) ist die Zahl der Schnitte aber viel kleiner, meist eher . Dann verschwendet der naive Algorithmus fast seine gesamte Zeit mit Paaren, die sich gar nicht schneiden.
Daraus folgt der Wunsch nach einem ausgabesensitiven Algorithmus, dessen Laufzeit von der Zahl der Schnitte abhängt. Dasselbe Motiv kennt man schon aus Kapitel 2 (Jarvis' March, ).
Schnitttest für zwei Strecken (Ergänzung)
Die Folien setzen den Test voraus. Mit dem Orientierungstest geht er ohne Division:
In Worten: und liegen auf verschiedenen Seiten der Geraden durch , und und liegen auf verschiedenen Seiten der Geraden durch . Ist eines der Produkte , liegt ein Endpunkt auf der anderen Geraden (Berührung oder kollinear), das ist ein Sonderfall.
Den Schnittpunkt selbst bekommt man dann über den Parameter