1.2.2 Primitive Operationen & 1.2.3 Rechenmodell
Um Laufzeiten geometrischer Algorithmen sauber angeben zu können, muss man festlegen, was ein Rechenschritt ist. Dazu dienen die primitiven Operationen und das Rechenmodell.
1.2.2 Primitive geometrische Operationen
Primitive Operationen sind Operationen, die nur Objekte konstanter Größe betreffen. Sie gelten im Rechenmodell als Operationen mit konstanter Laufzeit und konstantem Speicherbedarf, also .
| Primitiv ✔ | Nicht primitiv ✘ |
|---|---|
| Schnittpunkt zweier Geraden | Liegt ein Punkt in einem Polygon? |
| Liegt ein Punkt im Halbraum einer Hyperebene? | Schnitt zweier Polygone |
| Links-/Rechtstest Punkt vs. gerichtete Gerade | Konvexe Hülle von Punkten |
| Abstand zweier Punkte |
Warum ist „Punkt in Polygon“ nicht primitiv? Ein Polygon hat Ecken, ist nicht konstant. Der Test muss (im Allgemeinen) alle Kanten anschauen und kostet .
Merkregel: Primitiv ist, was sich mit einer festen Anzahl arithmetischer Operationen auf einer festen Anzahl von Koordinaten berechnen lässt, unabhängig von der Eingabegröße.
Der Orientierungstest
Steht so nicht explizit auf den Folien von 1.2.2, ist aber das Beispiel „Punkt liegt im Halbraum einer Hyperebene“ in 2D. In Kapitel 2 („liegt links von ?“, „Rechtskurve?“) wird er ständig benutzt.
Gegeben drei Punkte . Liegt links, rechts oder auf der gerichteten Geraden durch nach ?
Man bildet das 2D-Kreuzprodukt der Vektoren und :
| Ergebnis | Lage von | Kurve |
|---|---|---|
| links von | Linkskurve (gegen den Uhrzeigersinn) | |
| rechts von | Rechtskurve (im Uhrzeigersinn) | |
| auf der Geraden | keine Kurve, kollinear |
Warum funktioniert das? ist die Richtung, in die man läuft, zeigt zum Testpunkt. Das Kreuzprodukt ist positiv, wenn man gegen den Uhrzeigersinn um weniger als 180° drehen muss, um auf zu kommen, wenn also links liegt.
Zum Ausprobieren: Zieh die Punkte. Die grüne Seite ist „links von “, die orange „rechts“. Lege genau auf die Gerade, dann wird das Ergebnis 0.
c liegt links von a→b – Linkskurve (gegen den Uhrzeigersinn). Fläche des Dreiecks abc = |31| / 2 = 15.5. · Ziehe a, b oder c (Punkte rasten auf dem Gitter ein).
Zusatzbedeutung: ist der Flächeninhalt des Dreiecks . Ist er 0, ist das Dreieck entartet, die Punkte sind kollinear.
Beispiele:
| Rechnung | Ergebnis | |||
|---|---|---|---|---|
| links ✔ (über der x-Achse) | ||||
| rechts | ||||
| kollinear | ||||
| rechts |
Kosten: 2 Multiplikationen, 5 Subtraktionen, ein Vorzeichenvergleich, also primitiv, .
Man könnte auch Winkel mit atan2 berechnen und vergleichen. Der Orientierungstest liefert dieselbe Information aber ohne trigonometrische Funktionen, ohne Division und ohne Sonderfall bei senkrechten Geraden (keine Steigung ). Er ist schneller und weniger anfällig für Rundungsfehler.
1.2.3 Rechenmodell: Real RAM
Um Laufzeiten zu zählen, braucht man ein abstraktes Maschinenmodell. In der algorithmischen Geometrie ist das die Real RAM (Real Random Access Machine):
- Abzählbar unendlich viele Speicherzellen, adressierbar durch natürliche Zahlen.
- Jede Speicherzelle kann beliebige reelle Zahlen oder ganze Zahlen enthalten, mit unendlicher Genauigkeit.
- Folgende Operationen sind primitiv und kosten konstante Zeit:
- arithmetische Operationen:
- Vergleiche reeller Zahlen
- indirekte Adressierung (Zeiger, Arrayzugriff)
- Wurzeln, trigonometrische Funktionen, Logarithmen
Real RAM vs. echter Computer (Ergänzung)
Das Modell ist eine Idealisierung:
| Real RAM | Echter Rechner (double) |
|---|---|
| exakte reelle Zahlen | 64-Bit-Gleitkomma, ca. 16 Dezimalstellen |
| ist exakt entscheidbar | Rundungsfehler, fast kollineare Punkte bekommen evtl. das falsche Vorzeichen |
| , kosten | kosten real deutlich mehr als und |
Für die Laufzeitanalyse ist das Modell richtig. Für die Implementierung muss man wissen, dass Tests auf „“ mit Gleitkommazahlen fragil sind. Die Folien zu Kapitel 2 sagen beim naiven Algorithmus ausdrücklich: „Rundungsfehler der Gleitkommaarithmetik vernachlässigen“. Abhilfen in der Praxis sind ganzzahlige Koordinaten, exakte Arithmetik oder robuste Prädikate.