2012-10-03 90 views
11

Digamos que tengo una esfera D-dimensional con centro, [C1, C2, C3, C4, ... CD], y un radio R. Ahora quiero trazar N número de puntos distribuidos uniformemente (equidistante aparte de cada uno otro) en la superficie de la esfera. No importa dónde estén exactamente esos puntos, solo que están BASTANTE equidistantes entre sí. Quiero una función que devuelve una matriz de estos puntos, P.Cómo trazar N puntos en la superficie de una esfera D-dimensional aproximadamente equidistante aparte?

function plotter(D, C[1...D], R, N) 
{ 
    //code to generate the equidistant points on the sphere 

    return P[1...N][1...D]; 
} 

3-dimensional sphere with many points

3-dimensional sphere with a few points

+0

Esto es matemáticamente bastante técnico para hacerlo bien. En cambio, le preguntaría esto en math.stackexchange.com. Pero solo fíjelo como puntos en una unidad D-Sphere (ya que la escala y la traducción para hacer que tenga un radio R, centrado en (c_1, ..., c_D) es trivial. –

+0

No lo he pensado del todo, así que puede que no tenga sentido. ¿Qué pasa si comienzas con cualquier punto (digamos (R, 0, 0, ..., 0) y asumes que la esfera está centrada en el origen). Ahora gira ese punto en los ejes D-1 (no debería lo que es consecuente) por un ángulo de theta/(N-1) y poner un nuevo punto allí (esto implicará una gran cantidad de [multiplicación de matrices] (http://en.wikipedia.org/wiki/Rotation_matrix# General_rotations). Haz esto N-1 veces. Esto puede hacerte querer lo que quieres, pero me disculpo si falla horriblemente ya que no lo he pensado todo el tiempo. –

+0

Puede crear una solución aleatoria y luego restablecerla. Crea N puntos aleatorios en la D-Sphere. Evaluar usando una medida de uniformidad. Cambia aleatoriamente un punto aleatorio. Si eso mejora la medida, mantenga el ajuste, de lo contrario, deshazte. Repita hasta cansado. – NovaDenizen

Respuesta

0

La única manera que puedo pensar en que debe producir buenos resultados es.

  1. Genera N puntos en la superficie de la esfera. La forma habitual de hacer esto para altas dimensiones es generar los puntos según una distribución normal D-dimensional y normalizar de nuevo a la esfera. Estos no serán espaciados equitativamente, entonces necesitamos el paso dos
  2. Luego haga que cada punto rechace otros puntos usando alguna función de repulsión y use un pequeño paso de tiempo, usted ajusta la dirección del movimiento para que sea tangencial a la D-Sphere. Mueva el punto y luego vuelva a colocarlo en la esfera. Sigue haciendo esto hasta que consideres los puntos lo suficiente.
6

varias opciones:

  • aleatoriamente tiran puntos sobre la esfera y el uso de una relajación Lloyd para que se extendió de manera uniforme: se forma iterativa, calculan el diagrama de Voronoi y se mueven hacia el centro de la celda de Voronoi (en lugar de trabajar en la esfera, puede usar un diagrama voronoi euclidiano restringido a la esfera: CGAL puede hacerlo, por ejemplo, o consultar my article).

  • Si una aproximación aproximada es buena (es decir, si una distribución aleatoria uniforme es lo suficientemente buena), puede usar la fórmula explicada en Wiki: N-Sphere. Si no, aún puede utilizar este muestreo aleatorio como la inicialización del método anterior

  • Para una noción aún aleatoria pero mejor de muestras equidistantes, puede generar una distribución de disco de Poisson. El código rápido en alta dimensión está disponible en Robert Bridson's homepage. Puede que necesite adaptarlo para un dominio esférico.

1

No sé si esto se ha mencionado aquí todavía; pero podría, como otros han sugerido dibujar puntos de la distribución uniforme en la esfera. Después de lo cual, fluya cada punto según la energía de columbus; usando un método de descenso de gradiente Este problema en particular ha recibido mucha atención. Echa un vistazo a los siguientes paper y this website

+0

Como complemento escribí el código python para [generar distribuciones ordenadas de puntos en la esfera] (https://github.com/arvsrao/SpherePoints). – Arvind

+0

¿Sabes dónde encontrar una implementación para n-sphere? (n> 2) – gota

Cuestiones relacionadas