Es ist ein wenig unklar mir, was Sie fordern, aber hier ist einige Code, der Punkte gleichmäßig auf einem beliebigen Dreieck in der Ebene erzeugt.
import random
def point_on_triangle(pt1, pt2, pt3):
"""
Random point on the triangle with vertices pt1, pt2 and pt3.
"""
s, t = sorted([random.random(), random.random()])
return (s * pt1[0] + (t-s)*pt2[0] + (1-t)*pt3[0],
s * pt1[1] + (t-s)*pt2[1] + (1-t)*pt3[1])
Die Idee ist, ein gewichtetes Mittel der drei Scheitelpunkte zu berechnen, wobei die von einem Zufallsgenerator Bruch des Einheitsintervalls [0, 1]
in drei Stücke (gleichmässig über alle solche Pausen) angegebenen Gewichte.
Hier ist ein Beispiel für die Verwendung, die 10000 Punkte in einem Dreieck erzeugt:
pt1 = (1, 1)
pt2 = (2, 4)
pt3 = (5, 2)
points = [point_on_triangle(pt1, pt2, pt3) for _ in range(10000)]
und ein Grundstück von oben erhalten, was zeigt die Gleichförmigkeit.Das Grundstück wurde von diesem Code generiert:
import matplotlib.pyplot as plt
x, y = zip(*points)
plt.scatter(x, y, s=0.1)
plt.show()
Hier ist das Bild:
Und da Sie die Frage mit dem „numpy“ Tag markiert, hier ist eine NumPy Version, die mehrere Proben erzeugt an Einmal. Beachten Sie, dass es den Matrixmultiplikationsoperator @
verwendet, der in Python 3.5 eingeführt wurde und in NumPy> = 1.10 unterstützt wird. Sie müssen dies durch einen Aufruf an np.dot
für ältere Python oder NumPy-Versionen ersetzen.
import numpy as np
def points_on_triangle(v, n):
"""
Give n random points uniformly on a triangle.
The vertices of the triangle are given by the shape
(2, 3) array *v*: one vertex per row.
"""
x = np.sort(np.random.rand(2, n), axis=0)
return np.column_stack([x[0], x[1]-x[0], 1.0-x[1]]) @ v
# Example usage
v = np.array([(1, 1), (2, 4), (5, 2)])
points = points_on_triangle(v, 10000)
Die hier Anforderungen scheinen underspecified (und möglicherweise widersprüchlichen): Wenn 'X' und 'Y' sind _independent_ und jeweils gleichmäßig auf ein Intervall verteilt, werden sie ein Rechteck und nicht ein Dreieck abdecken. Wie ist dieses Dreieck spezifiziert und wie verhält es sich mit dem Bereich '[xmin, xmax]' und '[ymin, ymax]'? –
Sagen Sie uns nicht nur, was Sie wollen (besonders unterspezifiziert). Was hast du probiert? Was ist falsch gelaufen? Wo steckst du fest? –
Wahrscheinlich haben wir alle vermutet, dass "min, max" sich auf die Dreieckskoordinaten bezieht. Aber ich schaue auf ihre andere Frage, ich fürchte, wir werden kein Feedback bekommen. – MrT