Algorithmus zum Erzeugen eines zufälligen 2D-Polygons
Ich bin mir nicht sicher, wie Sie zur Lösung dieses Problems. Ich bin mir nicht sicher wie Komplex eine Aufgabe ist. Mein Ziel ist es, einen Algorithmus erzeugt, dass jedes polygon. Meine einzige Anforderung ist, dass das polygon nicht zu Komplex ist (D. H. Seiten nicht schneiden). Ich bin mit Matlab für das erledigen der Mathematik, aber etwas Abstrakt, ist willkommen.
Jede Hilfe/Richtung?
EDIT:
Ich dachte mehr an code, generieren konnte jedes polygon auch Dinge wie diese:
InformationsquelleAutor der Frage s5s | 2012-01-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweis: ich habe aktualisiert, meine Antwort mit einer Lösung, die einfach nimmt als Eingabe eine gewünschte Anzahl von Seiten für das polygon, statt ein paar nicht-intuitive "magischen zahlen", wie ich vor hatte...
Es ist eine nette Weise, das zu tun, was Sie wollen, nutzen Sie die MATLAB-Klassen DelaunayTri und TriRep und die verschiedenen Methoden, die Sie beschäftigen, für die Handhabung von dreieckigen Maschen. Der code unten folgt diese Schritte und erstellen Sie eine beliebige einfache polygon:
Generieren einer Anzahl zufälliger Punkte gleich der gewünschten Anzahl der Seiten plus eine fudge-Faktor. Der fudge-Faktor stellt sicher, dass unabhängig vom Ergebnis der triangulation, wir sollten genügend Facetten, um in der Lage sein, um schneiden Sie die dreieckige Gitter nach unten auf eine Fläche mit der gewünschten Anzahl der Seiten.
Erstellen Delaunay-triangulation der Punkte, was eine konvexes polygondie aufgebaut ist aus einer Reihe von dreieckigen Facetten.
Wenn die Grenze der triangulation hat mehr Kanten als gewünscht, wählen Sie eine zufällige dreieckige Facette auf dem Rand, hat einen eindeutigen Knoten (d.h. das Dreieck teilt eine Kante mit dem rest der triangulation). Das entfernen dieses dreieckige Facette wird die Anzahl der Begrenzungskanten.
Wenn die Grenze der triangulation hat weniger Kanten als die gewünschte, oder der Vorherige Schritt nicht in der Lage war zu finden, ein Dreieck zu entfernen, wählen Sie eine zufällige dreieckige Facette auf dem Rand, hat nur eine Kante, die auf der triangulation Grenze. Das entfernen dieses dreieckige Facette erhöht sich die Anzahl von Begrenzungskanten.
Wenn keine dreieckigen Facetten können gefunden werden, die den oben genannten Kriterien, stellen Sie eine Warnung, dass ein polygon mit der gewünschten Anzahl an Seiten nicht gefunden werden konnte und die Rückkehr der x-und y-Koordinaten der aktuellen triangulation Grenze. Ansonsten halten entfernen dreieckigen Facetten, bis die gewünschte Anzahl der Kanten erfüllt ist, dann wieder die x-und y-Koordinaten der triangulation Grenze.
Hier ist die resultierende Funktion:
Und hier sind einige Beispiel-Ergebnisse:
Den generierten Polygone werden könnte, entweder konvex oder konkavaber für eine größere Anzahl von gewünschten Seiten werden Sie fast sicher konkav. Die Polygone werden ebenfalls generiert aus Punkten, die zufällig generiert in einem Gerät Platz, also Polygone mit einer größeren Anzahl von Seiten wird in der Regel schauen, wie Sie einen "quadratischen" - Grenze (wie der unteren rechten Beispiel oben mit den 50-seitiges polygon). Zum ändern dieser Allgemeinen umschließende Form, Sie können ändern, wie der erste
x
undy
Punkte werden nach dem Zufallsprinzip ausgewählt (D. H. von einer Gauß-Verteilung, usw.).InformationsquelleAutor der Antwort gnovice
Nahm ich @MitchWheat und @templatetypedef Vorstellung der sampling-Punkte auf einem Kreis und nahm es ein bisschen weiter.
In meiner Anwendung, die ich in der Lage sein müssen zu kontrollieren, wie seltsam die Polygone, ie starten, mit regelmäßigen Vielecken und als ich Kurbel bis die Parameter, die Sie bekommen zunehmend chaotischer. Die grundlegende Idee ist wie bereits von @templatetypedef; zu Fuß rund um den Kreis, der unter einem zufälligen Winkel Schritt zu jedem Zeitpunkt und bei jedem Schritt setzen Sie einen Punkt bei einem zufälligen radius. In Gleichungen bin ich der Generierung der Winkel Schritte wie
wo theta_i und r_i geben, der Winkel und der radius des Punktes relativ zum Zentrum, U(min, max) zieht eine Zufallszahl aus einer Gleichverteilung, und N(mu, sigma) zieht eine Zufallszahl aus einer Gauß-Verteilung, und-clip, (x, min, max) Grenzwerte einen Wert in einem Bereich. Das gibt uns zwei wirklich schöne Parametern zu Steuern, wie wild die Polygone - epsilon, die ich nenne, Unregelmäßigkeit steuert, ob oder nicht, die Punkte sind gleichmäßig Raum winklig um den Kreis herum, und sigma, die ich nenne, spikeynessdie steuert, wie viel der Punkte kann variieren, die aus dem Kreis von radius r_ave. Wenn du beides auf 0 dann bekommen Sie das perfekt von regelmäßigen Vielecken, wenn Sie Kurbeln Sie dann die Polygone erhalten verrückter.
Ich peitschte diese bis schnell in python und habe Sachen wie diese:
Hier die vollständige python-code:
@MateuszKonieczny hier ist der code, um ein Bild zu erstellen in einem polygon aus einer Liste von vertices.
InformationsquelleAutor der Antwort Mike Ounsworth
Für ein 2D-polygon konvex (völlig aus der Spitze von meinem Kopf):
Generiert einen zufälligen radius, R
Generieren N zufällige Punkte auf dem Umfang eines Kreises mit dem Radius R
Bewegen sich um den Kreis und gerade Linien zwischen benachbarten Punkten auf dem Kreis.
InformationsquelleAutor der Antwort Mitch Wheat
Als @templatetypedef und @MitchWheat sagte, es ist einfach zu tun, so durch die Erzeugung
N
zufälligen Winkeln und Radien. Es ist wichtig, um die Art der Winkel, sonst wird es nicht sein ein einfaches polygon. Beachten Sie, dass ich bin mit einem netten trick zum zeichnen geschlossener Kurven - ich beschrieb es in hier. Durch die Art und Weise, die Polygone werden könnte konkav.Beachten Sie, dass alle diese Polygone werden sternförmig. Generieren ein allgemeineres polygon ist nicht ein einfaches problem.
Nur, um Ihnen einen Vorgeschmack auf die problem - check-out
http://www.cosy.sbg.ac.at/~held/projects/rpg/rpg.html
und http://compgeom.cs.uiuc.edu/~jeffe/open/randompoly.html.
InformationsquelleAutor der Antwort Andrey Rubshtein
Hier ist eine funktionierende Schnittstelle für Matlab von Mike Ounsworth Lösung. Ich habe nicht optimiert für matlab. Ich könnte aktualisieren Sie die Lösung später.
InformationsquelleAutor der Antwort MosGeo