Ich habe ein Bild, das Kreise an einer bestimmten Stelle und mit einem bestimmten Durchmesser enthält. Was ich tun muss, ist, in der Lage zu sein, zufällige Punkte innerhalb des Kreises zu berechnen und dann die Pixel zu manipulieren, mit denen die Punkte korrelieren. Ich habe bereits folgenden Code:
private Point CalculatePoint()
{
var angle = _random.NextDouble() * ( Math.PI * 2 );
var x = _originX + ( _radius * Math.Cos( angle ) );
var y = _originY + ( _radius * Math.Sin( angle ) );
return new Point( ( int )x, ( int )y );
}
Und das funktioniert gut, um alle Punkte am Umfang des Kreises zu finden, aber ich brauche alle Punkte von irgendwo im Kreis. Wenn dies keinen Sinn ergibt, lassen Sie es mich wissen und ich werde mein Bestes tun, um dies zu klären.
Antworten:
Wenn Sie eine einfache Lösung wünschen, können Sie auch den Radius zufällig bestimmen:
Dies hat jedoch zur Folge, dass Ihre Punkte mehr auf den Mittelpunkt des Kreises konzentriert sind:
Um eine gleichmäßige Verteilung zu erhalten, ändern Sie den Algorithmus wie folgt:
Welches wird das folgende Ergebnis geben:
Weitere Informationen finden Sie unter folgendem Link: MathWorld - Disk Point Picking .
Zum Schluss folgt eine einfache JsFiddle-Demonstration , in der beide Versionen des Algorithmus verglichen werden.
quelle
Verwenden Sie NICHT nur zufälliges r und Theta! Dies erzeugt eine gewichtete Verteilung mit mehr Punkten in der Mitte. Diese Seite illustriert es gut ...
http://mathworld.wolfram.com/DiskPointPicking.html
Hier ist die Methode, die eine nicht gewichtete Verteilung erstellt ...
quelle
Du bist auf halber Strecke. Zusätzlich zur Erzeugung eines zufälligen Winkels erzeugen Sie einfach einen zufälligen Abstand, der kleiner oder gleich dem Radius ist und so gewichtet wird, dass Sie eine gleichmäßige Verteilung erhalten:
Jetzt denkst du mit Polar .
Sie können den Abstand auch wie folgt gewichten, um eine Quadratwurzel zu vermeiden:
quelle
Wenn Leistung ein Problem ist, besteht eine alternative Lösung darin, eine zufällige Position in einem Feld mit der Breite / Höhe Ihres Kreises zu generieren und dann alle Punkte wegzuwerfen, die nicht im Bereich des Kreises liegen.
Der Vorteil dieser Methode ist, dass Sie keine cos / sin / sqrt-Funktionen ausführen, was abhängig von Ihrer Plattform eine große Geschwindigkeitseinsparung sein kann.
quelle
Ich habe den Ansatz eines der aufgelisteten Kommentare gewählt und die Funktionalität erweitert, um ein System zur Erzeugung von doughnutförmigen Punkten zu erstellen.
Es ist ein ähnlicher Ansatz wie zuvor erwähnt, lieferte jedoch unterschiedliche Ergebnisse. Der innere Teil des Kreises wird ohne Punkte leer gelassen.
quelle