Zufällige 3D Vektoren innerhalb einer Kugel
-
otze schrieb:
Für manche Dinge braucht e snicht C++11 sondern einfache Mathematik.
"einfache"? Ich hab grad keine Ahnung, wie das mathematisch gehen könnte.
-
Bashar schrieb:
otze schrieb:
Für manche Dinge braucht e snicht C++11 sondern einfache Mathematik.
"einfache"? Ich hab grad keine Ahnung, wie das mathematisch gehen könnte.
Grobe Erklaerung: Du suchst Zufallszahlen mit einer Vertielung p(y), wobei das Integral ueber p(y)dy auf 1 normiert ist. Dann kommt man nach etwas Rechnung da drauf, dass man auf 0:1 gleichverteilte Zufallszahlen x durch Anwendung der Funktion P^(-1)(x) auf die gewuenschte Verteilung p(y) transformieren kann. Dabei ist P das unbestimmte Integral von p und P(-1) dessen Umkehrfunktion. Im Allgmeinen ist der Knackpunkt da dran, dass die Funktion sich nicht einfach umkehren laesst, hier ist das bei der parabelfoermigen Verteilung der r-Koordinate aber noch einfach. Uebrigens muss man bei den theta und phi Koordinaten auch noch aufpassen, da man sonst mehr Werte an den Polen bekommt. Ist aber auf die Gleiche Art und Weise zu loesen.
Ich bin sicher, die allgemeine Transformation steht irgendwo bei Wikipedia. Und wie man gleichverteilte Punkte auf einer Kugelschlae zieht ist ein Standardproblem, dass man ueberall findet. Dann muss man nur noch eine passend verteilte Laenge ziehen, dann hat man es.
-
Bashar schrieb:
otze schrieb:
Für manche Dinge braucht e snicht C++11 sondern einfache Mathematik.
"einfache"? Ich hab grad keine Ahnung, wie das mathematisch gehen könnte.
Die Wahrscheinlichkeiten in den drei Distributionen müssten gewichtet werden, und zwar mit den Faktoren des Volumenelements.
d.h.:
phi_distribution: [0..2π), uniforme Verteilung
radius_distribution: [r1..r2], Verteilung geht mit r2
theta_distribution: [0..π], Verteilung geht mit sinθ
-
SeppJ schrieb:
@brotbernd, CStoll: Eure Methoden erzeugen beide keine Normalverteilungen. brotbernd ist da schon auf der richtigen Spur, aber deine Methode kann ich überhaupt nicht nachvollziehen. Schreibfehler oder übersehe ich da Sachen?
Die 2.Methode ist beliebig simpel. Ein gleichverteilten Punkt in einem Würfel ist sehr einfach. Zu prüfen, ob dieser Punkt innerhalb der Kugel liegt, die gerade in diesen Würfel passt ist auch sehr einfach. Die Punkte die innerhalb liegen merke ich mir, die die außerhalb liegen schmeiß ich weg.
Vielleicht kann man sich etwas kompliziertes und effizienteres überlegen, aber ich würde erstmal damit anfangen.
-
brotbernd schrieb:
Die Punkte die innerhalb liegen merke ich mir, die die außerhalb liegen schmeiß ich weg.
Vielleicht kann man sich etwas kompliziertes und effizienteres überlegen, aber ich würde erstmal damit anfangen.KLar, nur wirfst du beim vorliegenden Fall, wo der innenradius = 1/2 Außenradius der Kugelschale ist, knapp 46% der Ergebnisse weg
-
Ich habe jetzt nicht alle Post gelesen daher könnte es sein, dass mein Vorschlag schon gesagt wurde.
Man kann doch jedem Punkt in einer Kugel mit 2 Winkeln und einem Skalar genau beschreiben. Daher müsste man doch nur 2 Zufallszahlen zwischen 0 und 360 erstellen und eine Zufallszahl zwischen 0 und r und damit wäre man fertig.
-
bliblablid schrieb:
Ich habe jetzt nicht alle Post gelesen daher könnte es sein, dass mein Vorschlag schon gesagt wurde.
Ja, gleich als erste Antwort.
-
Ich habe dein Verfahren, SeppJ, leider nicht verstanden, denn wir haben Integralrechnung in der Schule auch noch nicht gemacht. Es wäre schön, wenn mir das jemand programmieren könnte.
Grüße
-
pumuckl schrieb:
KLar, nur wirfst du beim vorliegenden Fall, wo der innenradius = 1/2 Außenradius der Kugelschale ist, knapp 46% der Ergebnisse weg
Richtig. Aber wer sagt, dass das schlimm ist? Wenn am Anfang zur Initialisierung die Kugel in 2,17 ms statt in 1 ms mit zufälligen Punkten gefüllt wird, wen interessiert das?
Wenn das zu langsam ist, kann man sich immer noch was besseres ausdenken.
-
Muss es denn tatsächlich eine exakte Gleichverteilung in einer Kugel sein? Ich mein, die Sterne am Nachthimmel sind jetzt auch nicht wirklich gleichverteilt, sogar ziemlich weit davon entfernt...
-
Naja, es sollten zumindest nirgens Lücken zu sehen sein.
-
Wie wär's mit nem Würfel + Sichtschutz?
-
Würde das nicht alles ein bisschen komisch aussehen? Je nach Maßstab sollten Sterne entweder praktisch unendlich weit weg sein oder du mitten durch düsen. Eine relativ begrenzte Schale von Sternen, die das das Spielgebiet umschließt, würde dagegen doch mit Sicherheit auffallen.
-
Im Moment sind die Sterne mittendrin im Bereich, in dem sich das Raumschiff bewegen soll. Sieht eigentlich gut aus, bis auf die Tatsache, dass man zu den Kugeln hinfliegen kann und die dann halt sieht.
Bedenken habe ich da keine.
-
Wenn dein Rauschiff sich nur in einem begrenzen Bereich befindet und die nächsten Sterne nicht erreichen kann, dann ist die Näherung, dass alle Sterne unendlich weit entfernt sind, einiges realistischer. Die Lösung dafür ist einfach: Male das Bild der umgebenden Galaxis auf eine Kugelschale und projiziere die in entsprechend großem Abstand um dein Raumschiff. Und zwar so, dass es sich immer im Mittelpunkt der Kugel befindet.
-
@pumuckl:
Ich glaube das nennt man Skybox
-
314159265358979 schrieb:
Ich habe dein Verfahren, SeppJ, leider nicht verstanden, denn wir haben Integralrechnung in der Schule auch noch nicht gemacht. Es wäre schön, wenn mir das jemand programmieren könnte.
Ich habe im Moment gerade nicht die Mittel grossartig zu coden und an meinen schon fertigen Code fuer das Kugelproblem komme ich von hier gerade auch nicht dran. Wenn es dir morgen reicht, dann kann ich es dann machen, falls ich dran denke.
-
Alles klar. Alleine, dass du mir deinen 10000ten Post widmest, ist mir eine Ehre
-
Das einfachste ist natürlich X/Y/Z aus einem die Kugel umschließenden Würfel gleichverteilt zu ziehen und das solange zu wiederholen, bis der Radius passt.
Sonst könnte man das vielleicht noch so machen:
Richtung und Radius unabhängig ziehen.Gleichverteilte Richtung:
X/Y/Z/ Gauß-verteilt ziehen und normalisierenRadius ziehen:
Die Wahrscheinlichkeitsdichte für den Radius muss mit dem Radius quadratisch zunehmen, also:
P(r) \propto r^2
da die Kugeloberfläche ja mit dem Radius auch quadratisch zunimmt. Sonst bekommt man hinterher keine Gleichverteilung.
-
Das grundsätzliche Problem bei dieser Aufgabe ist, dass der Gültigkeitsbereich (und damit auch das Maximum) jeder Dimension sich in Abhängigkeit von den Werten der anderen zwei Dimensionen ergibt.
Ich habe zwar nichts von dem verstanden, was SeppJ erklärt hat, aber aus dem genannten Grund sehe ich keine andere Möglichkeit als den Würfel.