Einheitliche zufällige (Monte-Carlo) Verteilung auf Einheitskugel

8

Ich brauche eine Klarstellung mit einem Algorithmus, der Zufallswerte für meinen Ray-Tracer erzeugt Ich emittiere Strahlen von einem Punkt. Und ich habe das Problem mit der Verteilung dieser Strahlen: Ich brauche die Verteilung, um einheitlich zu sein, aber es ist nicht ...

Das Problem, dem ich jetzt gegenübersehe, ist, dass die Verteilung, die anfangs einheitlich ist, nach meinen Verzerrungen des Ergebnisraums nicht einheitlich ist.

Also zum Beispiel erzeuge ich r und t Winkel wenn das Polarkoordinatensystem. Die Verteilung ist nicht einheitlich und sie kann nicht einheitlich sein: Der Raum in der Nähe jedes Pols hat eine viel größere Dichte von Ergebnissen als beispielsweise in der Nähe des Äquators. Der Grund ist ziemlich klar: Ich konvertiere gleichmäßig verteilte Punkte vom zylindrischen in den sphärischen Bereich. Und ich verzerre die Ergebnisse. Das gleiche Problem tritt auf, wenn ich zufällig generierte Punkte im Würfel normalisiere.

Meine Idee ist jetzt: Ich möchte ein Tetraeder erstellen, seine Eckpunkte normalisieren, jede Fläche (Dreieck) mit dem Punkt in der Mitte teilen, normalisieren und rekursiv wiederholen, bis ich genug Punkte habe. Dann "verzere" ich diese Punkte ein wenig. Dann normalisiere ich sie wieder. Das ist es.

Ich verstehe, dass diese Methode keine reine mathematische Monte-Carlo-Methode selbst ist, weil ich in keinem Schritt Zufallsverteilung verwende, außer für die letzte. Und ich mag diese Lösung für diese Komplexität nicht.

Kann jemand etwas einfacher vorschlagen und dennoch

?
  • zufällig
  • Uniform
  • schnell
  • einfach

Danke!

BEARBEITEN:
Ich brauche eine schnelle Methode, nicht nur die richtige. Deshalb frage ich nach Monte-Carlo. Die Antworten sind korrekt, aber nicht schnell. Die Methode mit Tetraeder ist schnell, aber nicht sehr "zufällig" = & gt; falsch.
Ich brauche wirklich etwas passenderes.

    
avp 03.12.2009, 16:17
quelle

6 Antworten

9

Hier ist ein Algorithmus, mit dem Sie Punkte zufällig auf der Einheitskugel verteilt generieren können.

    
David Norman 03.12.2009, 16:29
quelle
5

Hier ist eine Java-Implementierung, die ich in der Vergangenheit verwendet habe:

%Vor%     
finnw 24.01.2011 16:33
quelle
3

Brauchen Sie wirklich eine zufällige Verteilung oder eine gleichmäßige Verteilung über die Kugel?

Dann würde ich ZCW-Winkel vorschlagen, die gleichmäßig über die gesamte Kugel verteilt sind und schnell berechnet werden können. Andere Methoden sind TheSydneyOperaHouse (SOPHE) und Repulsion. (Suche nach repulsion.c) Die Repulsionsmethode ist ziemlich gut, aber langsam: Sie verteilt iterativ Punkte gleichmäßig über eine Kugel. Zum Glück muss es nur einmal gemacht werden.

Dies wird in der Kristallographie und NMR verwendet, da es für Pulvermuster schneller ist, eine gleichmäßige Verteilung im Vergleich zur zufälligen Verteilung zu verwenden (Sie benötigen weniger Punkte).

Hier ist eine Python-Implementierung für ZCW.

Weitere Details in diesen Papieren:

mrossi 31.10.2011 10:04
quelle
1

Ich bin mir nicht sicher, ob das irgendeinen Sinn ergibt, aber hier gehst du:

Uniform Fractional Part: Eine einfache schnelle Methode zum Erzeugen kontinuierlicher Zufallsvariationen

    
Rubens Farias 03.12.2009 16:26
quelle
1

Wenn Sie nur triviale Szenen mit Raytracing betreiben, wird Ihre Renderzeit wirklich von der Sample-Picking-Zeit dominiert? Wenn nicht, lohnt es sich wahrscheinlich noch nicht, zu optimieren, obwohl es sich lohnt, die in den anderen Antworten gegebenen einheitlichen Stichprobenverfahren zu lesen und zu verstehen.

Außerdem müssen Ihre Samples nicht sehr zufällig sein, um eine gute Schätzung der von Ihnen gesampelten Funktion zu erhalten. Möglicherweise möchten Sie eine quasirandom Zahlensequenz wie die Halton-Sequenz untersuchen. Deine Tetraederunterteilungsidee ist nicht schlecht. Es sollte zu gut verteilten Punkten führen, die für die meisten Szenen besser sein sollten als gleichförmige Pseudozufalls-Samples, obwohl es unter Umständen zu schrecklichen Artefakten kommen könnte.

Wie auch immer, du solltest die Foren auf ompf.org konsultieren. Hab ein paar super Hardcore Raytracing Nerds da drüben.

    
Andrew Butts 05.12.2009 08:52
quelle
0

Bei sphärischen Abschnitten erzeugen Sie Ihren Winkel gleichmäßig in phi (Polarwinkel) und cos(theta) (für Theta den Azimutwinkel) zwischen Ihren Grenzen.

Im Pseudocode:

%Vor%

Dies ist ein Spezialfall der Regel, die besagt, dass die Jacobi invertiert und in diesem Raum von einheitlich erzeugt wird diese Koordinaten.

Hinweis: Beachten Sie, dass ich die entgegengesetzte Konvention für Phi und Theta von David Norman Linie verwende.

Beachten Sie auch: Dies ist nicht die schnellste Methode, sondern eine, die das allgemeine Prinzip veranschaulicht.

    
dmckee 03.12.2009 17:33
quelle

Tags und Links