Jak generować równomiernie rozmieszczone punkty w trójwymiarowej kulce?


11

Wysłałem poprzednie pytanie , jest to powiązane, ale myślę, że lepiej jest rozpocząć inny wątek. Tym razem zastanawiam się, jak wygenerować równomiernie rozmieszczone punkty w sferze jednostki 3-d oraz jak sprawdzić rozkład wizualnie i statystycznie? Nie widzę strategii tam zamieszczonych, które można by bezpośrednio przenieść na tę sytuację.


4
Techniki z poprzedniego pytania mają zastosowanie bezpośrednio, gdy zauważysz, że liczba punktów w odległości początku musi być proporcjonalna do r 3 . Zatem, jeśli generowania niezależnych jednolitego variate u w [ 0 , 1 ], wraz z punktu wagowo na powierzchni kuli, skalowanie w o U 1 / 3 wystarcza. rr3u[0,1]wwu1/3
whuber

@ whuber: może po prostu nie zrozumiałem istoty poprzednich technik. Pozwól mi spróbować tego, co opisałeś. Ponadto, jakie są sposoby, aby ponownie sprawdzić jednolitość tutaj?
Qiang Li

2
@ Qiang Ripley funkcja K i testy chi-kwadrat. Można również sprawdzić jednorodność rzutu promieniowego punktów na powierzchni kuli, jednorodność sześcianu długości punktów i niezależność tych dwóch.
whuber

Dla mnie nie jest tak oczywiste, co oznacza „równomiernie rozłożony” ... I prawdopodobnie próba zdefiniowania go automatycznie stworzy algorytm generujący (=

fR,Θ,Φ(r,θ,ϕ)=r2

Odpowiedzi:


14

43πr3=0.523...


+1. Jest to jedna z technik zalecanych przez comp.graphics.algorytmy FAQ „Ujednolicenie losowych punktów na kuli”.
David Cary,

1
n>100

2
Nazywa się to „metodą odrzucenia”. Pracując dobrze w trzech wymiarach, o dwadzieścia siedem wymiarów, tylko jeden na bilion punktów leży w kuli 27, a nie w pozostałej części 27 kostek, więc metoda odrzucania nie uogólnia się dobrze. Wspominam o tym, ponieważ obecnie potrzebuję próbek równomiernie w kulce o wymiarach 2440.
Reb.Cabin

13

xyzx=rsinθcosϕy=rsinθsinϕz=rcosθ

ϕ02πrθrr3r3r2rθ(1cosθ)/21(1cos(θ))/2θ>π/2θsin(θ)/2

θ11

W R wyglądałoby to tak, jak pokazano poniżej.

n <- 10000 # For example n = 10,000.
phi <- runif(n, max=2*pi)
r <- runif(n)^(1/3)
cos_theta <- runif(n, min=-1, max=1)
x <- r * sqrt(1-cos_theta^2) * cos(phi)
y <- r * sqrt(1-cos_theta^2) * sin(phi)
z <- r * cos_theta

Podczas pisania i edytowania tej odpowiedzi zdałem sobie sprawę, że rozwiązanie jest mniej trywialne, niż myślałem.

(x,y,z)r

xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda

3
Jest to o wiele lepsza odpowiedź z powodu braku odrzucenia. W przestrzeniach o dużych wymiarach próbka odrzucenia może być bardzo kosztowna ze względu na małe prawdopodobieństwo akceptacji.
kingledion

2
Powiedzmy, że ostatni fragment kodu można dostosować do wyższego wymiaru d. W tym celu, należy wymienić wszystkie wystąpienia 3przez d.
gui11aume

0

PP=N/||N||U1/nNU[0,1]1/nn

Zrobione!


2
Równomiernie rozłożony promień nie da jednorodnego punktu w piłce ...
kjetil b halvorsen

1
U
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.