Voronoi-Diagramme Martin Greilich [email protected] Das Dokument ist eine Ausarbeitung des Vortrags über Voronoi-Diagramme im Rahmen des Pro-Seminars ‚Algorithmische Geometrie’ betreut von Prof. Näher vom WS2004/05 an der Universität Trier. Als Grundlage dient das Buch ‚Computational Geometry in C’ von Joseph O`Rourke. Im Vortrag wird eine kurze Einführung zum Thema ‚Voronoi-Diagramme’ und deren Anwendungen gegeben. 2 Martin Greilich 1 Einführungsbeispiel Die grüne Fläche sei ein Wald mit Brandwachtürmen (rote Punkte). Jeder Brandwächter überwacht die Bäume, die näher zu seinem Turm sind, als zu jedem anderen. Die Menge aller Bäume, die von einem bestimmten Brandwächter überwacht wird, bildet das „Voronoi-Polygon“. Das „Voronoi-Diagramm“ zeichnet die Linien zwischen den Gebieten. Die Linien bestehen aus Punkten, an denen die Entfernung zu zwei oder mehr Türmen gleich ist. 2 Definitionen Sei P = {p1, p2, ..., pn} Menge von Punkten auf einer 2-dimensionalen Fläche. Diese Punkte werden Orte genannt. Zerteilt man die Fläche indem man deren Punkte zu ihrem nähersten Ort p i zuordnet, entstehen zu jedem Ort Voronoi-Regionen V(pi): V(pi) = {x: | pi – x | ≤ | pj – x | für alle j ≠ i } Manche Punkte werden mehr als einem Ort (oder auch nächsten Nachbarn) zugeordnet. Die Menge aller dieser Punkte bildet das Voronoi-Diagramm V(P) für die Menge der Orte. Voronoi-Diagramme 3 Zur Einführung betrachten wir zuerst Diagramme mit wenigen Orten: Zwei Orte Seien nun zwei Orte p1 und p2. B12 ist nun die Mittelsenkrechte zwischen p1 und p2. Dann ist jeder Punkt x auf B12 gleich entfernt zu p1 und p2. Nach dem Satz von Euklid ist |p1x| = |p2x|. Drei Orte Bei drei Orten p1, p2 und p3 ist klar, dass das Diagramm weg vom Dreieck (p1, p2, p3) aus den Mittelsenkrechten B12, B23 und B13 besteht. Wiederum nach Euklid ergibt sich, dass sich die Mittelsenkrechten eines Dreiecks in einem Punkt schneiden. Dieser Punkt ist der Umkreismittelpunkt eines Dreiecks. Also ergibt sich das Voronoi-Diagramm für drei Orte wie in dieser Abbildung: Beachte: Der Umkreismittelpunkt muss nicht zwangsweise im Dreieck liegen! 4 2.1 Halbebenen Es ist klar, dass die Mittelsenkrechten auch bei mehr als drei Orten eine Rolle spielen. Unterteilt man die Fläche in eine Halbebene H(pi, pj) mit der Grenze Bij und dem Ort pi, dann enthält die Menge H(pi, pj) die Punkte, die zu pi näher sind als zu pj. V(pi) ist nun die Menge der Punkte, die näher zu pi sind als zu allen anderen Orten. Oder auch: V(pi) enthält die Punkte näher zu pi als zu p1 und näher zu pi als zu p2 und ... näher zu pi als zu pn. Daraus ergibt sich für V(pi) folgende Gleichung: V(pi) = ∩i≠j H(pi, pj) Diese Gleichung zeigt nun eine wichtige Eigenschaft der Voronoi-Diagramme: Da der Durchschnitt von Halbebenen konvex ist, ist auch jede Voronoi-Region V(pi) ein konvexes Polygon. Die Kanten der Voronoi-Regionen heißen Voronoi-Kanten und die Knoten (Ecken) der Voronoi-Regionen heißen Voronoi-Knoten. Alle inneren Punkte der Voronoi-Kanten haben zwei nächste Orte. Alle Voronoi-Knoten haben mindestens drei nächste Orte. Hier ein Beispiel für ein Voronoi-Diagramm mit n = 20 Orten: Rot: Orte / Grau: Voronoi-Kanten / Grün: Voronoi-Knoten Voronoi-Diagramme 5 2.2 Größe des Diagramms Zur Vereinfachung des Beweises nehmen wir an, dass keine vier Orte `kozirkular´ sind. Das heißt, dass nicht mehr als drei Orte auf einem Umkreismittelpunkt liegen und deshalb jeder Voronoi-Knoten den Grad 3 hat. Nun konstruieren wir einen ungerichteten Graphen G wie gefolgt: - Die Knoten von G sind die Orte - Zwei Knoten werden mit einer Kante verbunden, wenn ihre Voronoi-Regionen sich eine Voronoi-Kante teilen. Für unser Diagramm aus dem Einführungsbeispiel ergibt sich folgender Graph(blau): Nun sind alle Punkte im Graph G verbunden und alle zur Knoten zugehörigen Kanten können nach ihrem Winkel geordnet werden. Man sieht auch (da wir für alle VoronoiKnoten Grad 3 voraussetzten), dass der Graph G ein `triangulärer´ Graph ist. Nach Euler (siehe Kapitel 4.1.5 im Buch) hat ein triangulärer Graph mit n Knoten max. 3n-6 Kanten und besteht aus max. 2n-4 Flächen. Da die Anzahl der Flächen des Graphen G mit der Anzahl der Voronoi-Knoten und die Anzahl der Kanten von G mit der Anzahl der Voronoi-Kanten übereinstimmt, folgt: #Voronoi-Knoten = O(n) #Voronoi-Kanten = O(n) 6 Wenn man nun die Einschränkung der Voronoi-Knoten auf Grad 3 aufhebt, ändert sich die Komplexität der Voronoi-Diagramme nicht, da nicht-trianguläre Graphen weniger Knoten und weniger Kanten haben. So bleibt es bei O(n). Als Folgerung aus max. 3n-6 Kanten kann man sagen, dass die durchschnittliche Anzahl der Voronoi-Kanten eines Polygons nicht mehr als sechs sein kann. 3 Delaunay Triangulations In 1934 zeigt Delaunay, dass der vorher beschriebene ungerichtete Graph G eine Triangulierung der Orte P eines Voronoi-Diagramms ist (falls jeder Voronoi-Knoten nicht höher als vom Grad 3 ist). Dies nennt man die Delaunay Triangulierung D(P). Voronoi-Diagramm V(P) Delaunay Triangulierung D(P) Delaunay Triangulierung D(P) über Voronoi-Diagramm V(P) 3.1 Eigenschaften der Delaunay Triangulierung Die Delaunay Triangulierung und die Voronoi-Diagramme enthalten die gleichen Informationen allerdings in verschiedener Form. Um die komplexe Struktur zu verstehen, sehen wir uns nun Eigenschaften einer Delaunay Triangulierung und den Zusammenhang zu dem Voronoi-Diagramm. Voronoi-Diagramme 7 Eigenschaften der Delaunay Triangulierung: D1. D(P) ist der ungerichtete Graph zu V(P). Dies folgt aus der Definition. D2. D(P) ist eine Triangulierung, wenn keine vier Punkte `kozirkular´ sind: Jede Fläche ist ein Dreieck. Das ist der Satz von Delaunay. Die Flächen von D(P) nennt man Delaunay Dreiecke. D3. Jedes Dreieck von D(P) entspricht einem Knoten von V(P). D4. Jede Kante von D(P) entspricht einer Kante von V(P). D5. Jeder Knoten von D(P) entspricht einer Region von V(P). D6. Die Ränder von D(P) ergeben die konvexe Hülle der Orte. D7. Das Innere jedes Dreiecks von D(P) enthält keine Orte. Eigenschaften der Voronoi-Diagramme: V1. Jede Voronoi-Region V(pi) ist konvex. V2. V(pi) ist unbegrenzt, wenn pi auf der konvexen Hülle der Menge P liegt. V3. Wenn v ein Voronoi-Knoten am Verbindungspunkt von V(p1), V(p2) und V(p3) ist, dann ist v der Mittelpunkt des Kreises C(v) auf dem p1, p2 und p3 liegt. (Dies gilt generell für Voronoi-Knoten aller Gerade.) V4. C(v) ist der Umkreis des zu Voronoi-Knoten v gehörenden Delaunay Dreiecks. V5. Das Innere von C(v) enthält keine Orte. V6. Wenn pj der `nächste Nachbar´ von pi ist, dann ist (pi, pj) eine Kante von D(P). V7. Wenn es einen Kreis durch pi und pj gibt welcher keinen anderen Orte enthält, dann ist (pi, pj) eine Kante von D(P). Aus der Umkehrung folgt: Für jede Delaunay-Kante gibt es leere Kreise Beweis zu V7.: Behauptung: ab ist Delaunay-Kante gdw. es einen leeren Kreis durch a und b gibt: D.h. dieser Kreis enthält weder im Inneren noch auf dem Rand einen anderen Ort außer a und b. Beweis: „=>“ Wenn ab eine Delaunay-Kante ist, dann teilen sich V(a) und V(b) eine Kante e des Voronoi-Diagramms V(P) (siehe Definition von D(P)). Nun bildet man einen Kreis C(x) mit Mittelpunkt x, der im Inneren(!) der Kante e liegt und den Radius gleich dem Abstand zu a oder b hat. Dieser Kreis ist leer! Denn angenommen der Punkt c ist im oder auf dem Kreis: Dann wäre x auch in V(c). Dies ist aber ein Widerspruch dazu, dass x nur in V(a) und V(b) sein soll. „<=“ Nehmen wir an es gibt einen leeren Kreis C(x) durch a und b mit Mittelpunkt x. Weil x gleichweit zu a und b ist, ist x in der Voronoi-Region von a und b, solange kein Ort kommt, die näher ist als a und b. Dies ist aber nicht möglich, da der Kreis leer sein soll! Deshalb ist x im Durchschnitt von V(a) und V(b). 8 Wir können nun x auf der Mittelsenkrechten Bab von a und b bewegen, wobei der Kreis immer noch durch a und b geht, ohne die Eigenschaft zu verlieren leer zu sein. Daraus ergibt sich, dass x auf der Voronoi-Kante (Untermenge von Bab) zwischen V(a) und V(b) liegt. Und daraus folgt, dass ab Element von D(P) ist. q.e.d. 4 Algorithmen zur Berechnung des Voronoi-Diagramms Nun sehen wir uns einige Vorgehensweisen an, wie man das Voronoi-Diagramm berechnen kann. 4.1 Durchschnitt von Halbebenen Man kann (wie schon erwähnt) jede Voronoi-Region bilden indem man den Durchschnitt von n - 1 Halbebenen nach der Gleichung V(pi) = ∩i≠j H(pi, pj) bildet. (Zur Erinnerung: H ist die Fläche zum Ort, die von der Mittelsenkrechten begrenzt wird.) Durchschnitt von n Halbebenen ist gleich der Arbeit beim Erstellen einer 2dimensionalen konvexen Hülle von n Punkten und kann mit ähnlichen Algorithmen in O(n log n) Zeit erledigt werden. Bei n Voronoi-Regionen ist der Gesamtaufwand O(n2 log n). 4.2 Iterative Konstruktion Angenommen wir haben bereits ein Voronoi-Diagramm V mit k Orten berechnet und würden gerne ein Diagramm V´ erstellen, nachdem wir den Ort p hinzugefügt haben. Nehmen wir an p fällt in das Innere eines (bisher Ort-freies) Kreises C(v) mit Voronoi-Knoten v als Mittelpunkt. Dann kann v nicht mehr Voronoi-Knoten von V´ sein, da die Bedingung V5 (das Innere von C(v) enthält keine Orte) verletzt wird. Daraus ergeben sich alle Knoten, die aus V entfernt werden müssen. Es ergibt sich ebenfalls, dass alle auf eine bestimmte Fläche des Diagramms begrenzt sind. Aus diesen Beobachtungen entwickelten Green & Sibson 1977 einen Algorithmus, der das Einsetzen eines Ortes in O(n) schafft. Daraus ergibt sich für das Erstellen eines Voronoi-Diagramms eine Gesamtlaufzeit von O(n2). Bemerkung: Dies war trotz der quadratischen Laufzeit die übliche Methode ein Voronoi-Diagramm zu erstellen. Voronoi-Diagramme 9 4.3 Divide and Conquer Voronoi-Diagramme können mit einem komplexen divide-and-conquer Algorithmus in O(n log n) Zeit erstellt werden. Die Komplexität von O(n log n) ist asymptotisch optimal, aber dieser Algorithmus ist sehr schwer zu implementieren. 4.4 Fortune’s Algorithmus Bis Mitte der 80er Jahre benutzten die meisten den iterativen Algorithmus(4.2) um die komplexe Implementierung des divide-and-conquer Algorithmus zu vermeiden. In 1985 entwickelte Fortune einen plane-sweep Algorithmus, der einfacher als der iterative war, und im schlechtesten Falle Komplexität O(n log n) hatte. Die Grundidee: Eine sweep-Linie durchläuft eine Fläche. Für den bereits passierten Abschnitt steht die Lösung schon fest, für den Rest noch nicht. In unserem Fall wäre das VoronoiDiagramm für den passierten Abschnitt fertig. Vorbemerkung 1: Kegel Die Orte p1 und p2 seien auf der xy-Ebene eines 3-dimensionalen Koordinatensystems. Über jedem Ort sei ein Kegel mit Gipfel in p dessen Seiten eine Neigung von 45° haben. Seien nun zwei Kegel über den Orten p1 und p2. Diese zwei Kegel schneiden sich in einer Kurve im Raum. Diese Kurve liegt auf einer vertikalen Ebene. Durch diese Ebene kann man denn Schnitt auf die xy-Ebene projizieren. Wenn man nun für alle Orte die Kegel von unten aus (z = -∞) betrachtet (mit der Annahme, dass die Kegel undurchsichtig sind), sieht man das Voronoi-Diagramm. 10 Vorbemerkung 2: Schnitt durch die Kegel Fortune lässt nun alle Kegel mit einer zur xy-Ebene 45° geneigten Ebene π durchlaufen. Die sweep-Linie L ist der Schnitt der Ebene π mit der xy-Ebene. L sei parallel zur y-Achse und seine x Koordinate sei l. Stellen wir uns nun vor π sowie alle Kegel seien undurchsichtig und wir schauen nun von unten (z = -∞) herauf. Rechts von L (x > l) sehen wir nur die Unterseite von π, weil sie die xy-Ebene schneidet und die Orte mit deren Kegeln verdeckt. Diese Seite muss noch durchlaufen werden. Der Schnitt von π und jedem Kegel ist eine Parabel. An den Stellen wo zwei Parabeln sich treffen, trifft π zwei Kegel. Aus Vorbemerkung 1 kann man schließen, dass an diesen Stellen eine Voronoi-Kante sein muss. Voronoi-Diagramme 11 Parabolische Front Da π die selbe Neigung (45°) wie die Kegel hat, trifft die sweep-Linie L den Ort p genau dann, wenn π den Kegel von p zum ersten mal berührt. Nun müssen wir nur die „parabolische Front“ beobachten, die die Kegel der Orte geschnitten mit π ergeben. An den „Knicken“ der parabolischen Front (Knicke sind die Stellen, wo zwei Parabeln sich schneiden) ist eine Voronoi-Kante. Wir müssen nur den Verlauf der parabolischen Front abspeichern, um daraus das Voronoi-Diagramm zu erstellen. Die Komplexität der Größe um die Front zu speichern ist O(n) und oft sogar nur O(√n). Dies ist ein großer Vorteil des Fortune Algorithmus: Bei großem n ist die Größe des Gespeicherten oft viel kleiner als das des Diagramms. Bemerkung: n ist oft groß! (z.B. 106 bei geographischen Informationssystemen) 5 Anwendungen Eine Anwendung der Voronoi-Diagramme war bereits das Einführungsbeispiel. Zuletzt sehen wir uns noch zwei andere Anwendungsbeispiele an. 5.1 Nächster Nachbar Nun suchen wir den „nächsten Nachbarn“ zu jedem Punkt in einer gegebenen Menge. Diese Anwendung wird in vielen Gebieten benutzt (z.B. Biologie, Ökologie, Geographie und Physik). Definition der „nächster Nachbar“-Relation über eine Menge von Punkten: b ist ein nächster Nachbar von a gdw. |a – b| ≤ minc≠a|a – c| (c ist Element von P). Schreibweise: a → b Diese Relation ist nicht symmetrisch! (siehe Abbildung: a → b, aber nicht b → a) 12 Bemerkung: Ein Punkt kann mehrere nächste Nachbarn haben. Siehe Punkt d in der Abbildung. Nächster Nachbar Anfragen Gegeben sei eine Menge P von Punkten und das dazugehörige Voronoi-Diagramm. Nun brauchen wir für einen neuen Anfragepunkt q nur noch herausfinden in welcher(n) Voronoi-Region(en) er liegt. Die zu diesen Voronoi-Regionen zugehörigen Orte sind nächste Nachbarn von q. Dieses Problem wird „point location“ genannt und wird im Kapitel 7 des Buches besprochen. Es kann für jede Anfrage in O(log n) Zeit erledigt werden. Alle Nächsten Nachbarn Definieren wir den Nächster-Nachbar-Graph (NNG) um jedem Punkt der Menge P mit seinem nächsten Nachbarn zu verbinden. Wenn dieser Graph als ungerichtet definiert wird (obwohl die Relation nicht symmetrisch ist), kann man folgendes Lemma aufstellen: Lemma: NNG ist Teilmenge von D(P) (= Delaunay Triangulierung) Ein primitiver Algorithmus würde O(n2) benötigen. Durch unser Lemma wissen wir, dass wir nur die O(n) Kanten der Delaunay Triangulierung von P durchsuchen müssen. Dies ergibt eine Gesamtlaufzeit von O(n log n). 5.2 Größter Leerer Kreis Suche nach dem größten leeren Kreis in einer Menge S von Orten hat z.B. folgende Anwendung: Wenn die Orte Filialen einer Firma sind, ist die Mitte des größten leeren Kreises der optimale Ort für das Errichten einer neuen Filiale. oder: Wenn die Orte Städte sind, ist diese Mitte der optimale Ort für die Errichtung eines nuklearen Reaktors (weit weg von Zivilisation). Eigentlich ist es unsinnig einen größten Kreis zu suchen da außerhalb jeder Menge unendlich große leere Kreise sind. Deshalb fassen wir das Problem so auf: Größter Leerer Kreis: Finde einen größten leeren Kreis dessen Mitte in der konvexen Hülle der Menge S von n Orten ist. Leer, so dass er kein Ort im Inneren hat. Größter, so dass kein anderer solcher Kreis besteht der einen echt-größeren Radius hat. Sei f(p) der Radius des größten leeren Kreises mit Mitte p. Dann suchen wir das Maximum dieser Funktion über alle Punkte p in der konvexen Hülle H von S. Aber man muss scheinbar unendlich viele solche Punkte überprüfen um das Maximum zu finden. Voronoi-Diagramme 13 Eine übliche Vorgehensweise in der berechnenden Geometrie ist unendlich viele „Kandidaten“ auf eine kleinere endliche Anzahl zu reduzieren um die Effizienz zu erhöhen. So gehen wir nun auch vor: Mittelpunkte innerhalb der Hülle Stellen wir uns vor, es wird ein Kreis vom Punkt p aus aufgeblasen, bis er platzt, wenn ein Ort der Menge S = {s1, s2, ... , sn} ins Innere kommt. Dann ist f(p) der Radius in diesem Zeitpunkt. Lasst uns zunächst annehmen, dass p streng im Inneren der Hülle H ist. Wenn am Radius f(p) der Kreis genau ein Ort s1 im Inneren hat, dann ist klar, dass f(p) nicht das Maximum der Funktion ist. Wenn p aber entlang einer Geraden s1p hinweg von s1auf den Punkt p´ verschoben wird, dann ist f(p´) größer. Es gibt immer einen Punkt p´ in der Nachbarschaft von p wo f größer ist. Bemerkung: Dies ist nur der Fall, weil wir voraussetzten, dass p streng im Inneren der Hülle liegt und deshalb immer ein Punkt p´ in H existiert! Lasst uns also annehmen, dass bei Radius f(p) der Kreis genau zwei Orte s1 und s2 berührt. Wieder kann f(p) nicht das Maximum sein: Wenn man p entlang der Mittelsenkrechten von s1s2 auf p´ verschiebt, dann ist f(p´) wieder größer. 14 Daraus folgt, dass der Kreis mit Radius f(p) durch drei Orte gehen muss. Da aber die Mitte eines solchen Kreises genau auf einem Voronoi-Knoten liegt, folgt daraus: Lemma 1: Wenn die Mitte p eines größten leeren Kreises streng im Inneren der konvexen Hülle H aller Orte S liegt, dann muss p auf einem Voronoi-Knoten liegen. Mittelpunkte auf der Hülle Jetzt müssen wir nur noch den Fall betrachten bei dem die Kreismitte auf der Hülle liegt. Denn Fall, dass p auf einem Knoten der Hülle liegt, können wir ausschließen, da diese immer ein Ort sind (Def. Hülle H). So muss p auf der Kante h von H liegen. Nehmen wir also wieder an, dass der Kreis um p durch genau ein Ort s1 geht. Wenn wir aber denn Punkt p entlang h weg von s1 auf p´ verschieben, wird f(p´) größer. Also kann der Punkt p nur lokales Maximum sein, wenn der Kreis durch zwei Orte geht. Dann ist p aber auch auf einer Voronoi-Kante. Daraus folgt: Lemma 2: Wenn die Mitte p eines größten leeren Kreises auf der konvexen Hülle H aller Orte S liegt, dann muss p auf einer Voronoi-Kante liegen. Algorithmus Nun sind wir kurz vor dem Ziel. Wir haben eine endliche Menge von möglichen Punkten, die Mitten des größten leeren Kreises sein könnten: Voronoi-Knoten Schnittpunkte der Voronoi-Kanten mit der Hülle der Orte Bemerkung: Nicht alle Voronoi-Knoten liegen zwangsweise in der Hülle! Nach unserer Definition vom größten leeren Kreis kommen diese Knoten nicht als Mitten in Betracht. Diese muss im Algorithmus beachtet werden. Zur Laufzeit: Der Test, ob ein Voronoi-Knoten in der Hülle liegt, kann in O(log n) geschehen (siehe Kapitel 7 im Buch). Der Schnitt der Voronoi-Kanten mit der Hülle Voronoi-Diagramme 15 kann ebenfalls in O(log n) durchgeführt werden. Daraus ergibt sich eine Gesamtlaufzeit von O(n log n). Algorithmus: GRÖßTER LEERER KREIS Berechne das Voronoi-Diagramm V(S) der Orte S. Berechne die konvexe Hülle H der Orte S. for alle Voronoi-Knoten v do if v ist im Inneren von H then Berechne den Radius des Kreises mit Mittelpunkt v und bringe max auf den neusten Stand. for alle Voronoi-Kanten e do Berechne den Schnittpunkt p zwischen e und der Hülle. Berechne den Radius mit Mittelpunkt p und bringe max auf den neusten Stand. Gebe max zurück.