2008-09-17 12 views
23

Ich arbeite an einem Spiel, wo ich eine zufällige Karte von Provinzen (a la Risk oder Diplomatie) erstellen. Um diese Karte zu erstellen, erzeuge ich zuerst eine Reihe von halb-zufälligen Punkten, um dann die Delaunay-Triangulationen dieser Punkte zu berechnen.Wie leite ich ein Voronoi-Diagramm anhand seiner Punktmenge und seiner Delaunay-Triangulation ab?

Nachdem ich damit fertig bin, suche ich nun ein Voronoi-Diagramm der Punkte, die als Ausgangspunkt für die Provinzgrenzen dienen sollen. Meine Daten zu diesem Zeitpunkt (kein Wortspiel beabsichtigt) besteht aus der ursprünglichen Reihe von Punkten und einer Sammlung der Delaunay-Dreiecke.

Ich habe eine Reihe von Möglichkeiten gesehen, dies im Internet zu tun, aber die meisten von ihnen sind mit dem Delaunay verbunden. Ich würde gerne etwas finden, das nicht in den Delaunay integriert werden muss, sondern allein anhand der Daten arbeiten kann. Wenn ich das nicht schaffe, suche ich nach etwas, das für einen Neuling der relativen Geometrie verständlich ist, im Gegensatz zur optimalen Geschwindigkeit. Vielen Dank!

Antwort

18

Das Voronoi-Diagramm nur das duale Graph der Delaunay-Triangulation ist.

  • Also sind die Kanten des Voronoi-Diagramms entlang der Mittelsenkrechten der Kanten der Delaunay-Triangulation, also berechnen Sie diese Linien.
  • Berechnen Sie dann die Scheitelpunkte des Voronoi-Diagramms, indem Sie die Überschneidungen benachbarter Kanten ermitteln.
  • Schließlich sind die Kanten dann die Teilmengen der Linien, die Sie berechnet haben, die zwischen den entsprechenden Eckpunkten liegen.
  • Beachten Sie, dass der genaue Code von der internen Darstellung abhängt, die Sie für die beiden Diagramme verwenden.

    +17

    Sie können auch das duale (dh. Voronoi-Diagramm) nur durch Berechnen der circumcentres aller Dreiecke, und verbinden von zwei circumcentres, deren Dreiecke eine Kante teilen. – batty

    +5

    Wie im obigen Kommentar vorgeschlagen, würde ich es in zwei Schritten tun: 1. Berechnen Sie den Umkreismittelpunkt jedes Delaunay-Dreiecks -> dies sind die Voronoi-Vertices. Siehe http://en.wikipedia.org/wiki/Circumscribed_circle#Circumscribed_circles_of_triangles 2. Berechnen Sie für jede Delaunay-Kante eine Voronoi-Kante: das Segment, das die Umkreise der beiden benachbarten Delaunay-Dreiecke verbindet. –

    +2

    @ balint.miklos Was ist mit äußeren Seiten/Dreiecken zu tun? – Orient

    0

    Nun, der Grund, warum die Dinge zusammenhängen, ist, weil die Delaunay-Triangulation und das Voronoi-Diagramm Dualstrukturen sind. Das heißt, es ist ein Kinderspiel, von Voronoi nach Delaunay und umgekehrt zu gehen.

    Das bedeutet, wenn Sie ein Voronoi-Diagramm haben, müssen Sie nur die Punkte verbinden, die eine Kante teilen, und Sie haben die Delaunay-Triangulation (und umgekehrt).

    +2

    Wenn Sie nur die Punkte verbinden, die eine Kante teilen, erhalten Sie die ursprüngliche Grafik, oder? –

    8

    Wenn optimale Geschwindigkeit keine Überlegung ist, wird der folgende Pseudo-Code erzeugen ein Voronoi den harten Weg Diagramm:

    for yloop = 0 to height-1 
        for xloop = 0 to width-1 
    
        // Generate maximal value 
        closest_distance = width * height 
    
        for point = 0 to number_of_points-1 
         // calls function to calc distance 
         point_distance = distance(point, xloop, yloop) 
    
         if point_distance < closest_distance 
         closest_point = point 
         end if 
        next 
    
        // place result in array of point types 
        points[xloop, yloop] = point 
    
        next 
    next 
    

    Vorausgesetzt, dass Sie einen ‚Punkt‘ Klasse oder Struktur haben, wenn man sie zufällige Farben zuweisen, dann sehen Sie das vertraute Voronoi-Muster, wenn Sie die Ausgabe anzeigen.

    +0

    Das ist alles schön und schön, aber ich sehe keinen Nutzen für ein Voronoi-Diagramm, das als Bild erzeugt wird. Vielleicht gibt es einen? – Tara

    +1

    Nicht als ein Bild per se, aber ich habe es für die prozedurale Kachel-basierte Weltgeneration verwendet (wobei jede Kachel durch die Zelle bestimmt ist, zu der sie gehört). – Garan

    0

    Jedes Ihrer Delaunay-Dreiecke enthält einen einzelnen Punkt des Voronoi-Diagramms.

    Sie können diesen Punkt berechnen, indem Sie für jedes Dreieck den Schnittpunkt der drei perpendicular bisectors finden.

    Ihr Voronoi-Diagramm verbindet diese Punkte mit jeweils den nächsten drei Nachbarn. (jeder Nachbar teilt eine Seite des Delaunay-Dreiecks)

    Wie planen Sie, sich den Randfällen zu nähern?

    +0

    Beachten Sie, dass, obwohl für jedes Delaunay-Dreieck ein Voronoi-Eckpunkt entspricht, dieser Eckpunkt ** auch außerhalb des Dreiecks ** liegen kann. Ein Beispiel finden Sie hier: http://www.mathopenref.com/trianglecircumcenter.html –

    2

    Nachdem ich versucht habe, diesen Thread als Quelle für Antworten auf meine eigene ähnliche Frage zu verwenden, fand ich, dass Fortunes Algorithmus - wahrscheinlich, weil er am populärsten ist - am einfachsten zu verstehen war.

    The Wikipedia article on Fortune's algorithm enthält neue Links zum Quellcode in C, C# und Javascript. Alle von ihnen waren erstklassig und kamen mit schönen Beispielen.