35 votos

Generar una dirección al azar dentro de un cono

Tengo una normalizado $3D$ vector de darle una dirección y un ángulo que se forma un cono alrededor de ella, algo como esto:

Direction cone

Me gustaría generar un aleatorios uniformemente distribuidos vector normalizado para una dirección dentro de ese cono. También me gustaría apoyar a ángulos mayores de pi (pero inferior o igual a $2\pi$), momento en el que la forma se vuelve más como una esfera de la que una de cono se ha quitado. ¿Cómo puedo proceder?

Pensé acerca de los siguientes pasos, pero mi aplicación no parece funcionar:

  • Encontrar un vector normal al eje del cono vector (cruzando el eje del cono de vector con el eje cardinal que corresponde con el eje del cono vector componente más cercano a cero, por ejemplo: $[1 0 0]$$[-1 5 -10]$)
  • Encontrar un segundo vector normal el uso de un producto cruzado
  • Generar un azar ángulo entre el $[-\pi, \pi]$
  • Gire el uso de los dos vectores normales como $2D$ sistema de coordenadas para crear un nuevo vector en el ángulo generado previamente
  • Generar al azar un valor de desplazamiento entre el $[0, \tan(\theta)]$ y raíz cuadrada (para normalizar la distribución como para los puntos dentro de un círculo)
  • Normalizar la suma del eje del cono de vector con el azar vector normal veces el valor de desplazamiento para llegar a la final vector de dirección

[editar] Después de pensar, no estoy seguro de que el método de trabajo con theta ángulos mayores o igual a pi. Los métodos alternativos son muy bienvenidas.

35voto

JiminyCricket Puntos 143

Me sorprende cómo muchas malas, óptimo y/o demasiado complicado respuestas a esta pregunta se ha inspirado, cuando hay una muy sencilla solución; y que la única respuesta que menciona y utiliza los más relevantes, de hecho, Cristiano Blatter, no tienen una sola upvote antes de que yo sólo upvoted.

El $2$-esfera es la única en la que los segmentos de la misma altura tienen igual área de la superficie. Es decir, a los puntos de muestreo en la unidad de la esfera uniformemente, se puede degustar $z$ uniformemente en $[-1,1]$ $\phi$ uniformemente en $[0,2\pi)$. Si el cono se centraron alrededor del polo norte, el ángulo de $\theta$ definiría un mínimo de $z$ coordinar $\cos\theta$, y se podía muestra $z$ uniformemente en $[\cos\theta,1]$ $\phi$ uniformemente en $[0,2\pi)$ para obtener el vector $(\sqrt{1-z^2}\cos\phi,\sqrt{1-z^2}\sin\phi,z)$ distribuidos de manera uniforme requerido.

Así que todo lo que tiene que hacer es generar un vector y, a continuación, gire el polo norte hasta el centro de su cono. Si el cono está ya centrada así, ya está hecho; si es centrado en el polo sur, acaba de invertir el vector; de lo contrario, tomar la cruz, producto del cono del eje con $(0,0,1)$ para obtener la dirección del eje de rotación, y el producto escalar para obtener el coseno del ángulo de rotación. O si prefiere, usted puede aplicar su idea de la generación de dos vectores ortogonales, en la forma Cristiana de describir.

18voto

CodingBytes Puntos 102

Sus cuatro primeros puntos son absolutamente correcta como se indica. Así que ahora tiene dos mutuamente ortogonal de vectores unitarios ${\bf u}$, ${\bf v}$, ambos ortogonal al eje ${\bf a}$ del cono, donde $|{\bf a}|=1$. El azar vector unitario en el cono será un vector ${\bf x}$ de la forma $${\bf x}=\sin\theta\bigl(\cos\phi\,{\bf u}+\sin\phi\, {\bf v}\bigr)+\cos\theta\,{\bf a}\ .$$ Aquí $\phi$ tiene que ser elegido de manera uniforme en $[-\pi,\pi]$, e $\theta$ tiene que ser elegido de acuerdo a algunos de distribución aún no se determina en el intervalo de $[0,\theta_0]$ donde $\theta_0$ es el ángulo se denota por a $\theta$ en su figura. Tenga en cuenta que $\theta_0$ está restringida al intervalo de $[0,\pi]$, no $[0,2\pi]$ como se indica en su pregunta.

Ahora queremos que los vectores ${\bf x}$ a ser equidistributed en el casquete esférico dado por $0\leq\theta\leq\theta_0$, donde "equidistribución" se refiere a que el área medida en la esfera de la $S^2$.

Aquí el siguiente primaria de hecho viene en nuestra ayuda: Cuando un cilindro $C$ de la altura de la $2$ se envuelve alrededor del ecuador de una unidad de la esfera, a continuación, cualquiera de los dos planos ortogonales al eje del cilindro de determinar un "anillo esférico" y un anillo cilíndrico, y las áreas de estos dos anillos coinciden. Esto implica que los puntos distribuidos uniformemente sobre el cilindro $C$ "proyecto" a los puntos uniformemente distribuidos en la esfera de la $S^2$.

Esta observación se reduce a la siguiente receta: Elija $z$ distribuidos uniformemente en el intervalo de $[\cos\theta_0,1]$, y poner $\theta:=\arccos(z)$. Además vamos a $\phi$ estar distribuidos de manera uniforme en $[0,2\pi]$. A continuación, el punto de $${\bf x}=\sin\theta\bigl(\cos\phi\,{\bf u}+\sin\phi\, {\bf v}\bigr)+\cos\theta\,{\bf a}$$ serán distribuidos uniformemente sobre el casquete esférico en cuestión.

6voto

Bluebird75 Puntos 4612

Estoy suponiendo que el tipo de distribución uniforme que desea es una en la cual la probabilidad es proporcional al ángulo sólido.

Me gustaría generar un ángulo polar $\theta$ y un ángulo azimutal $\phi$, y, a continuación, determinar el vector de eso. $\phi$ pueden estar distribuidos de manera uniforme entre 0 a $2\pi$.

Usted no desea $\theta$ estar distribuidos de manera uniforme, sin embargo; usted quiere que su distribución de probabilidad proporcional al $\sin\theta$, ya que es como el ángulo sólido varía con $\theta$.

Una forma de lograr esto es para generar un valor de$\theta$, con una distribución uniforme entre 0 y $\theta_{max}$, pero luego de aceptarlo con una probabilidad de $\sin\theta$; si no es aceptado, intenta de nuevo. Esto tiene la desventaja de que pueden ser ineficientes, especialmente si $\theta_{max}$ es pequeña.

Una mejor técnica es la de encontrar un mapa $\theta=f(x)$ que si $x$ es distribuido uniformemente en [0,1], $\theta$ se distribuye en $[0,\theta_{max}]$, con una distribución de probabilidad proporcional a $\sin\theta$. Esto se puede hacer mediante el uso de la relación general entre la distribución de probabilidad de dos variables aleatorias que están relacionados por alguna función; es esencialmente sólo una aplicación de la regla de la cadena. Esta es una técnica estándar.

WP tiene artículos en ambas técnicas:

http://en.wikipedia.org/wiki/Rejection_sampling

http://en.wikipedia.org/wiki/Inverse_transform_sampling

5voto

Robert Christie Puntos 7323

Asumir la dirección de cono del eje está dado por $(0,0,1)$.

La dirección aleatoria dentro del código corresponde a un punto al azar en una esfera, truncado hacia abajo a la parte corta por un cono. La medida sobre una esfera en coordenadas esféricas factores de $\cos \vartheta d \theta d \varphi$. El cono corresponde a una región dada por $ 0\leqslant \vartheta\leqslant\theta$$0\leqslant \varphi <2 \pi$.

Por lo tanto debemos recurrir $0 \leqslant \vartheta < \theta$ a partir de la densidad $$f(\vartheta) \,\mathrm{d}\vartheta = \frac{1}{1-\cos \theta} \sin \vartheta \, \mathrm{d} \vartheta = \mathrm{d} \left( \frac{1-\cos \vartheta }{1-\cos \theta}\right) = \mathrm{d} F(\vartheta)$$ then uniform $\varphi$ from $[0, 2\pi)$ y, a continuación, construir $$(x,y,z) =(\sin \vartheta \cos\varphi, \sin \vartheta \sin\varphi, \cos \vartheta)$$

Para muestra $\vartheta$ calculamos el cuantil de la distribución de $\vartheta$ y aplicar el uniforme de la variable aleatoria (véase la inversión del método): $$ \vartheta = F^{(-1)}(u) = \arccos( 1-u + u \cos \theta) $$ where $u$ follows uniform distribution on unit interval. Notice that $z$-componente $$ \cos \vartheta = 1 \cdot (1-u) + \cos\theta \cdot u $$ se distribuye uniformemente en $(1,\cos\theta)$, de acuerdo con el algoritmo de Cristiano y Joriki. Ver también en esta importante cuestión.

0voto

lkreinitz Puntos 1

vamos a por la simplicidad generar puntos dentro de un ángulo ALFA del polo norte

P = (1 - cos(ALFA))/2

U = aleatorio(0,1) un valor aleatorio en el rango (0,1)

PHI = acos(1-2*P*U)

THETA = aleatorio (-PI,PI)

PHI es el ángulo desde el polo norte

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X