Zufällige Punkte in einem Parallelogramm
Habe ich eine 4 Seite konvex-Polygon definiert durch 4 Punkte in 2D, und ich möchte in der Lage sein zum generieren zufälliger Punkte drin.
Wenn es wirklich vereinfacht das problem, ich kann limit das polygon, ein Parallelogramm, aber eine Allgemeine Antwort ist bevorzugt.
Erzeugung von Zufallszahlen Punkte, bis man innerhalb des Polygons nicht funktionieren würde, weil es wirklich unberechenbar wie lange es dauert.
Kommentar zu dem Problem - Öffnen
was meinst du mit random? Sie können wählen, zufällige Punkte, die Verlegung auf der diagonalen. Oder möchten Sie die komplette Füllung des gesamten Polygons, wenn Sie genug produzieren zufällige Punkte?
Wenn ich genug produzieren ich möchte füllen Sie das gesamte polygon
Dies könnte nicht einfacher sein: zeichnen Sie ein schlichtes Rechteck, das gerade groß genug ist, schliessen Sie Ihren poly. (Oder in der Tat, jede "Form oder Sache" auch immer.) Nun erzeugen Sie die Punkte, die zufällig verteilt in diesem einschließenden Ebene Platz. Für jeden test, wenn es in Ihrer Form. Werfen jene, die sich außerhalb der Form. Es ist so einfach. Hoffe, es hilft!
InformationsquelleAutor der Frage Turambar | 2008-10-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
A. Wenn Sie beschränken Sie Ihre Eingabe auf Parallelogramm, das ist wirklich einfach:
u
undv
.Wenn Ihr Parallelogramm ist definiert durch die Punkte ABCD, so dass AB, BC, CD und DA sind die Seiten, dann nehmen Sie Ihre Stelle als:
Wo
AB
ist der Vektor von A nach B undAD
den Vektor von A nach D.B. Jetzt, wenn Sie nicht, können Sie immer noch die barycentric coordinates. Die barycentric coordinates entsprechen, für ein quad, 4-Koordinaten
(a,b,c,d)
so dassa+b+c+d=1
. Dann, einen beliebigen PunktP
innerhalb der quad kann beschrieben werden durch eine 4-uple:In Ihrem Fall, können Sie ziehen 4 Zufallszahlen und zu normalisieren, so dass Sie bis zu 1. Geben Sie einen Punkt. Beachten Sie, dass die Verteilung der Punkte wird NICHT einheitlich sein in diesem Fall.
C. Sie können auch, wie vorgeschlagen, anderswo, zerlegen Sie die quad in zwei Dreiecke und verwenden die Hälfte-Parallelogramm-Methode (d.h., als das Parallelogramm, aber Sie fügen Sie die Bedingung
u+v=1
) oder die barycentric coordinates für Dreiecke. Allerdings, wenn Sie möchten, gleichmäßige Verteilung, die Wahrscheinlichkeit, dass ein Punkt in einem Dreieck gleich sein müssen, um die Fläche eines Dreiecks, dividiert durch die Fläche des quad.InformationsquelleAutor der Antwort PierreBdR
Die Frage der OP ist ein bisschen zweideutig, so die Frage, die ich beantworten will, ist: Wie generieren Sie einen Punkt von einer gleichmäßigen Verteilung innerhalb eines beliebigen Vierecks, die eigentlich eine Verallgemeinerung der Wie generieren Sie einen Punkt von einer gleichmäßigen Verteilung innerhalb eines beliebigen (konvexen) polygon. Die Antwort basiert auf dem Fall der Erzeugung einer Stichprobe aus einer Gleichverteilung in einem Dreieck (siehe http://mathworld.wolfram.com/TrianglePointPicking.html, die eine sehr schöne Erklärung).
Um dies zu erreichen wir:
Triangulieren des Polygons (D. H. generieren eine Sammlung von nicht überlappenden dreieckigen Regionen, die decken, die polygon). Für den Fall eines Vierecks, erstellen eine Kante über
zwei nicht-benachbarte Ecken. Für die anderen Polygone, siehe http://en.wikipedia.org/wiki/Polygon_triangulation für einen Ausgangspunkt, oder http://www.cgal.org/ wenn Sie nur eine Bibliothek.
Holen Sie eines der Dreiecke, zufällig, lassen Sie uns weisen Sie einen index auf jedes Dreieck (also 0,1,2,...). Für das viereck, Sie werden 0,1. Für jedes Dreieck weisen wir eine Gewichtung wie folgt:
Generiert dann eine zufällige index i aus der finite-Verteilung über Indizes aufgrund Ihrer GEWICHTE. Für das viereck, das ist eine Bernoulli-Verteilung:
Lassen v0, v1, v2 werden Eckpunkte des Dreiecks (vertreten durch Ihre Punkt-Orte, so dass v0 = (x0,y0), etc. Dann erzeugen wir zwei Zufallszahlen a0 und a1, sowohl gezeichnet als einheitlich aus dem Intervall [0,1]. Dann berechnen wir den beliebigen Punkt x durch x = a0 (v1-v0) + a1 (v2-v0).
Beachten Sie, dass mit Wahrscheinlichkeit 0.5, x ausserhalb liegt außerhalb des Dreiecks, aber wenn es das tut, liegt im inneren des Parallelogramms aus der union des Dreiecks mit Bild nach einer Drehung um pi um den Mittelpunkt von (v1,v2) (gestrichelte Linien in der Abbildung). In diesem Fall können wir erzeugen Sie einen neuen Punkt x' = v0 + R(pi)(x - v3), wobei R(pi) ist eine Drehung um pi (180 Grad). Der Punkt x' im Innern des Dreiecks.
Ist weiter zu beachten, dass, wenn das viereck war bereits ein Parallelogramm, dann haben wir nicht wählen Sie ein Dreieck auf dem Zufallsprinzip, können wir wählen, entweder eine deterministisch, und wählen Sie dann den Punkt x, ohne Prüfung, ist es innen Quelle Dreieck.
InformationsquelleAutor der Antwort cheshirekow
Angenommen, Sie wollen eine gleichmäßige Verteilung: Bilden zwei Dreiecke, die von Ihr polygon. Wählen Sie, welches Dreieck zu erzeugen, der Punkt, in der je nach Gebiet-Verhältnis.
Rufen Sie die Ecken des Dreiecks A, B, C, die Seite Vektoren AB, BC, AC und erzeugt zwei Zufallszahlen in [0,1] wird aufgerufen, u und v. es seien p = u * AB + v * AC.
Wenn A+p liegt innerhalb des Dreiecks, return A+p
Wenn A+p außerhalb des Dreiecks, return A + AB + AC - p
(Dies ist im Grunde PierreBdR-Formel-außer für die Vorverarbeitung und den letzten Schritt Falten Sie den Punkt wieder in ein Dreieck, so kann es die Behandlung anderer Formen als Parallelogramme).
InformationsquelleAutor der Antwort jakber
Ihr polygon in zwei Dreiecke, warum also nicht nach dem Zufallsprinzip wählen Sie eine von denen, dann finden Sie einen zufälligen Punkt in dem Dreieck.
Wahrscheinlich nicht die beste Lösung, aber es würde funktionieren.
InformationsquelleAutor der Antwort jonnii
Etwas weniger " naiv " - Ansatz wäre die Verwendung einer polygon fill algorithm, und wählen Sie Punkte aus der fill-Linien nach dem Zufallsprinzip.
C-Code-Beispiel
InformationsquelleAutor der Antwort wprl
Durch das "allgemein" meinst du alle nicht-Parallelogramm, 4-seitige Polygone im Allgemeinen, oder alle möglichen Polygone?
Wie etwa Zeichnung, eine zufällige Verbindung zwischen den 4 Seiten, z.B. Wenn Sie diese:
Dann generiert einen zufälligen Punkt auf einem Gerät Platz, dann markieren Sie den Punkt auf der Linie B und D, die den Prozentsatz der Abstand auf der X-Achse. Das gleiche tun auf der Linie A und C mit dem Wert aus der Y-Achse.
Verbinden Sie dann den Punkt auf Linie A nach Linie C und Linie B Linie D, der Schnittpunkt wird dann als random-point.
Es ist nicht einheitlich, weil die Rundungsfehler die helfen werden, gewisse Punkte, aber es sollte in der Nähe sein, wenn Sie die Arbeit mit floating-points-Werte.
Umsetzung sollte ziemlich einfach sein, auch, da Sie bereits arbeiten mit Polygonen. Sollten Sie bereits code, der nicht die einfachen Aufgaben.
Hier ein kurzer pseudocode:
InformationsquelleAutor der Antwort chakrit
Diese Werke für die Allgemeine, konvexe Vielecke:
Können Sie leihen einige Konzepte aus der Finite-Elemente-Methode, insbesondere für viereck (4-seitiges) Elemente (finden Sie im Abschnitt 16.5 hier). Grundsätzlich gibt es eine Bilineare Parametrisierung, dass die Karten einen Platz in der u-v-Raum (für u, v \in [-1, 1] in diesem Fall) zu Ihrem viereck, die aus Punkten besteht p_i (i = 1,2,3,4). Beachten Sie, dass sofern Referenz, die Parameter genannt werden \eta \xi.
Basic-Rezept:
Das problem ist nur, dass gleichmäßig verteilte Punkte in der u-v-Raum nicht produzieren gleichmäßig verteilte Punkte in Ihrem quad (im euklidischen Sinne). Wenn das wichtig ist, können Sie direkt in 2D innerhalb der bounding box die quad und schreiben Sie eine point-in-quad (vielleicht durch die Aufteilung des Problems in zwei Punkt in tris) test zu pflücken zufällige Punkte, die draußen sind.
InformationsquelleAutor der Antwort Not Sure
Tun, die Punkte müssen gleichmäßig verteilt, oder ist die Verteilung ok?
Kann das polygon konkav sein, oder ist es garantiert konvex sein?
Wenn die Antwort auf die oben genannten nicht haben, dann Holen Sie zwei beliebige Knoten und wählen Sie sich einen beliebigen Punkt auf der Strecke zwischen Ihnen. Dies ist beschränkt auf die Linie segements verbinden der Eckpunkte (ie, SEHR non-uniform); Sie können tun, ein wenig besser, durch die Auswahl einer Dritten Eckpunkt und dann die Kommissionierung ein Punkt zwischen diesem und dem ersten Punkt-immer noch nicht-einheitliche, mindestens aber jeden Punkt im polygon ist möglich
Kommissionierung einen zufälligen Punkt auf einer Linie zwischen zwei Punkte ist ganz einfach, Eine + p(B-A), wobei A und B sind die Punkte und p ist eine zufällige Zahl zwischen 0.0 und 1.0
InformationsquelleAutor der Antwort Chris Dodd
Welche Art von distribution Sie wollen die Punkte zu haben? Wenn Sie sich nicht sorgen, die oben genannten Methoden funktionieren. Wenn Sie möchten, eine gleichmäßige Verteilung, die folgende Prozedur funktioniert: Teilen Sie das polygon in zwei Dreiecke, a und b. Lassen Ein(a) und(b) werden Ihre Bereiche. Beispiel eines Punktes p von der gleichmäßigen Verteilung auf das Intervall zwischen 0 und A(A)+(b). Wenn p < Ein(a), wählen Sie im Dreieck ein. Wählen Sie andernfalls Dreieck b. Wählen Sie einen vertex v von der gewählten Dreieck, und lassen c und d werden die entsprechenden Vektoren der Seiten des Dreiecks. Beispiel zwei zahlen x und y aus der exponential-Verteilung mit unit-Durchschnitt. Dann ist der Punkt (xc+yd)/(x+y) ist eine Stichprobe aus der Gleichverteilung auf dem polygon.
InformationsquelleAutor der Antwort Alex Coventry
Die MATLAB-Funktion cprnd erzeugt Punkte aus der gleichmäßigen Verteilung auf ein allgemein konvexes polyTOP. Für deine Frage einen spezialisierten Algorithmus basiert auf der ZERLEGUNG der viereck in die Dreiecke effizienter ist.
InformationsquelleAutor der Antwort Tim Benham
Für PostGIS, das ist, was ich verwende (vielleicht möchten Sie eine Gemeinde für möglich, Endlosschleifen). Sie könnten den export der Algorithmus zu Ihrer Programmiersprache:
InformationsquelleAutor der Antwort