3 Stimmen

Wie kann man einen Punkt auf der Erdoberfläche zufällig auswählen?

Wie der Titel schon sagt: Wie wählt man eine Koordinate auf der Erdoberfläche zufällig und ohne Verzerrung aus? Die einfache Lösung mit rand(-90,90),rand(-180,180) wird die Polarregionen gegenüber den Äquatorregionen bevorzugen.

7voto

Matt Ball Punkte 343109

Es klingt, als ob Sie nach einem gleichmäßige Zufallsverteilung auf einer Kugel .

enter image description here

In sphärischen Koordinaten:

 = 2 * rand(0,1)
 = arccos(1 - 2*rand(0,1))

2voto

Steve Jessop Punkte 264569

Archimedes bewies ein raffiniertes Theorem, wonach die Fläche einer Region auf einer Kugel gleich der Fläche der horizontalen Projektion dieser Region auf die gekrümmte Fläche eines umschreibenden Zylinders ist (und somit insbesondere die Fläche der gesamten Kugel gleich der Fläche der gesamten gekrümmten Fläche des umschreibenden Zylinders ist). Man kann sich davon überzeugen, indem man kleine "Rechtecke" (begrenzt durch Breiten- und Längengrade) zeichnet und für diese beweist und dann (informell) feststellt, dass an der Grenze alles durch ausreichend kleine Rechtecke angenähert wird, oder formaler, dass die Fläche einer Region als ein Integral definiert ist, d. h. (dank Lebesgue) als Grenze einer Reihe von Summen von Rechtecken.

Wenn man also einen zufälligen, gleichmäßig verteilten Punkt auf der gekrümmten Fläche des Zylinders wählt (einfach, da er isometrisch zu einem Rechteck ist) und diesen Punkt dann horizontal auf die Kugel zurückprojiziert, hat die Verteilung die Eigenschaft, dass die Wahrscheinlichkeit, dass ein Punkt in einem beliebigen Bereich liegt, proportional zur Fläche des Bereichs ist.

Das bedeutet, dass der Längengrad einheitlich im Bereich (-pi, pi] gewählt und der Breitengrad auf arccos(y) - pi/2 , wobei y gleichmäßig im Bereich (-1,1] verteilt ist.

Aufgrund der (mangelnden) Genauigkeit des von Ihnen verwendeten Fließkommatyps haben Sie immer noch eine kleine Verzerrung arccos . Ich bin mir nicht sicher, ob sich das bemerkbar macht, aber wenn ja und wenn Sie das beheben wollen, können Sie Ihre y-Werte auf +/-1 präziser machen (indem Sie mehr Bits nach dem Dezimalpunkt erzeugen). Oder besser gesagt, teilen Sie den Bereich in zwei Teile, erzeugen Sie zusätzliche Bits in der Nähe von 0 und verwenden Sie dann eine genaue arccos_1_minus_x Funktion.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X