2010-04-20 28 views
6

Deseo generar aleatoria y uniformemente puntos en un cilindro y un cono (por separado). El cilindro está definido por su centro, su radio y su altura. Mismas especificaciones para el cono. Puedo obtener el cuadro delimitador para cada forma, así que estaba pensando en generar puntos dentro del cuadro delimitador. Sin embargo, no estoy seguro de cómo proyectarlos en el cilindro/cono o si esta es la mejor idea.generación uniforme de puntos 3D en cilindro/cono

¿Alguna sugerencia?

Gracias.

+1

Parece que la proporción va de 1.5 a 0.5. Probablemente quieras ratio = (max_y-y)/cone-> Height() en su lugar. – comingstorm

+1

Además, para evitar que sus puntos se agrupen alrededor del vértice, usted quiere y = (max_y-min_y) * (1-sqrt (RandomNumber())) + min_y – comingstorm

+0

parece que la pregunta en su EDIT ha sido respondida. ¿Puedes limpiarlo o agregar otro EDIT para indicar que ha sido respondido? – brainjam

Respuesta

4

La caja del cilindro es trivial. Si el cilindro de radio r> 0 y altura h> 0 es la imagen de (x, y, z) = (r cos φ, r sin φ, z) en φ ∈ [0, 2π [y z ∈ [-h/2, h/2], luego simplemente elija φ y z al azar en estos intervalos. Por supuesto, también se puede parametrizar el cono utilizando la parametrización estándar, pero el elemento de área no será constante en el plano de los parámetros, por lo que la distribución de los puntos no será aleatoria. Por lo tanto, necesita encontrar una parametrización diferente. He discutido este tema en detalle para una esfera en my AlgoSim site.

2

Sería más simple generar los puntos directamente en el cilindro o cono.

Ha pasado un tiempo desde que hice esto, pero parametrice el eje del cilindro y luego, para cada punto, parametrizo el círculo a esa altura. Esto creará puntos en la superficie. El radio del círculo es el radio del cilindro.

Para el cono necesita reducir el radio del círculo a medida que se mueve de la base al vértice.

-1

poner esas respuestas en pseudocódigo:

Para un cilindro, dado cylinderRadius y cylinderHeight:

angle = random number between 0 & 360 

x = cos(pi/180*angle)*cylinderRadius 
y = sin(pi/180*angle)*cylinderRadius 
z = random number between 0 and cylinderHeight. 

Para un cono, dado coneRadius, coneHeight:

angle = random number between 0 & 360 

z = random number between 0 and coneHeight 

thisRadius = coneRadius * (1-(z/coneHeight)); //This gives a decreasing radius as height increases. 

x = cos(pi/180*angle)*thisRadius 
y = sin(pi/180*angle)*thisRadius 

Cada punto (x, y, z) estarán en el cilindro/cono. Genere suficientes de estos puntos y puede generar partículas en la superficie de un cilindro/cono, pero puede no hacer una distribución exactamente uniforme ...

+0

El problema * es * para encontrar una distribución uniforme, y este no es el caso en su código para el cono. –

2

Una forma de pensar esto es que tanto el cilindro como el cono pueden se debe desenvolver en superficies planas, simplemente corte cada una con una línea recta de arriba a abajo.

El cilindro se desenvuelve en un rectángulo (si incluye la parte superior e inferior, a continuación, agregue un par de discos).

El cono se desenvuelve en un triángulo con un fondo curvo que es el arco de un círculo (si se incluye la base del cono, luego se agrega un disco).

Es bastante fácil insertar estas superficies planas dentro de un rectángulo R en el plano xy. Genere puntos distribuidos uniformemente en R, y siempre que se encuentren dentro de las superficies planas, vuelva a asignarlos a las superficies originales.

Tenga cuidado con algunas de las otras respuestas aquí que intentan coordinar un cono en términos de ángulo y altura. Aunque los puntos se distribuirán uniformemente con respecto al ángulo y la altura, no se distribuirán de manera uniforme w.r.t. zona. Estarán más densamente distribuidos en la punta.

0

Deje un punto de ser definido por coordenadas r, un, h, en donde r es el "radio" (distancia desde el eje vertical que pasa por el centro), un es el ángulo como en las coordenadas polares, y h es su altura.

Para el cilindro (radio R y la altura H): elegir independientemente

  • un uniforme en [0, 2pi),
  • h uniforme en [0 , H] y
  • r con una "densidad triangular": f (r) = 2 r/R si 0 < = r < = R, 0 en caso contrario (la densidad en r debe ser proporcional a la longitud de la circunferencia de radio r).

No debería ser difícil de tomar muestras de dicha distribución triangular, ya que su distribución acumulativa (un monomio cuadrática) es fácilmente reversible (ver this article). Además, esta respuesta se basa en la intuición, pero no debería ser difícil probar que la distribución que obtienes en el cilindro es uniforme.

Para el cono (radio R y la altura H): elegir

  • un uniforme en [0, 2pi),
  • h con una densidad hecha con un segmento de parábola: f (h) = 3 (H - h)^2/H^3 si 0 < = h < = H, 0 en caso contrario (la densidad en h debe ser proporcional al área de la sección circular a la altura h),
  • dejar que r (h) = (h-h) R/h (el radio de la sección a la altura del h); luego elegir r con una f "distribución triangular" (r) = 2 r/r (h) si 0 < = r < = r (h), 0 de otra manera.

Una vez más, el muestreo de h debe ser fácil, ya que la distribución acumulativa es fácilmente invertible.

EDITAR. Si se refiere a generar puntos de en la superficie de las formas, entonces la solución es simple:

Cilindro: elegir

  • un uniforme en [0, 2 pi),
  • h uniforme en [0, h],
  • r = R.

Cono: elegir

  • un uniforme en [0, 2pi),
  • h con una densidad triangular: f (h) = 2 (H - h)/H^2 si 0 < = h < = H, 0 en caso contrario (la densidad en h debe ser proporcional a la longitud de la circunferencia a la altura h).
  • r = r (h) = (H-h) R/H = radio a la altura h.
+0

Creo que quiere puntos * en * el cilindro, no dentro de él. –

+0

Vaya. ¿Te refieres en la superficie? –

+0

Sí, por definición, un cilindro (y un cono) es una superficie en el espacio, no un objeto sólido. Y creo que el OP está usando esta definición matemática, porque usa la preposición "on" en lugar de "inside". –

-1

Para los puntos uniformes sobre un círculo o un cono de radio R y altura/elevación H:

generate: 
    angle= uniform_random(0,2*pi) 
    value= uniform_random(0,1) 

in either case, let: 
    r= R * sqrt(value) 

then (using separate random numbers for each): 
    circle_point= point3d(r*cos(angle), r*sin(angle), H) 
or: 
    cone_point= point3d(r*cos(angle), r*sin(angle), r*H) 

Tenga en cuenta que si quieres una base en su cono, tendrá que hacerlo por separado de la forma curva. Para asegurarse de que la densidad de puntos sea la misma para las diferentes partes, una manera fácil es calcular las áreas de las partes y generar un número proporcional de puntos para cada parte.

El sqrt (valor) es lo que asegura que la densidad de sus puntos aleatorios sea uniforme. Como han mencionado otras preguntas, desea una distribución triangular para esto; tomando sqrt() convierte la distribución uniforme en [0,1) en una triangular.

Para un cilindro no desea el sqrt(); la parte curva es:

cylinder_point= point3d(R*cos(angle), R*sin(angle), H*value) 
0

Otras respuestas ya han cubierto la caja del cilindro bastante bien. Para el cono, las cosas son un poco más difíciles. Para mantener una densidad constante de puntos, necesita compensar el cambio en el radio.

Para hacer eso, puede comenzar seleccionando una distancia entre los puntos. A medida que se mueve a lo largo del eje del cono, calcula la circunferencia a esa altura, luego divida la circunferencia en la distancia lineal entre los puntos para obtener el número de puntos. A continuación, divida 2pi radianes (o 360 grados, o lo que sea) por el número de puntos para obtener la distancia angular de ese radio.

Según la precisión que necesite, puede hacer un seguimiento del resto de un círculo mientras calcula el siguiente círculo. Por ejemplo, si tiene dos círculos seguidos que necesitan xxx.4 puntos, los redondeará a cada uno si los mira de forma aislada, pero mirándolos juntos, tiene xxx.8 puntos, por lo que debería redondear una hacia abajo y la otra hacia arriba para mantener la densidad total lo más cerca posible del valor correcto.

Tenga en cuenta que, aunque no es tan obvio, este último también puede aplicarse al cilindro: normalmente tendrá un redondeo en la distribución de cada círculo de puntos.

Cuestiones relacionadas