algorithm - solve - Dispersando n puntos uniformemente sobre una esfera.
wolfram alpha function graph (4)
Aquí hay un ejemplo de algoritmo que acabo de poner en Python:
from numpy import random, cos, sin, sqrt, pi
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
def rand_sphere(n):
"""n points distributed evenly on the surface of a unit sphere"""
z = 2 * random.rand(n) - 1 # uniform in -1, 1
t = 2 * pi * random.rand(n) # uniform in 0, 2*pi
x = sqrt(1 - z**2) * cos(t)
y = sqrt(1 - z**2) * sin(t)
return x, y, z
x, y, z = rand_sphere(200)
fig = plt.figure()
ax = fig.add_subplot(111, projection=''3d'')
ax.scatter(x, y, z)
plt.show()
De nuevo con 10000 puntos:
Estoy tratando de dispersar n puntos en una esfera de modo que cada punto tenga la "misma" área "alrededor". Básicamente, estoy tratando de integrar una función sobre una esfera mediante la evaluación en n puntos y asumiendo que cada elemento del área es el mismo (e igual a 4pi r ^ 2 / n).
Mi pregunta está muy relacionada con esta , pero parece que no estoy de acuerdo con que el código presentado en la respuesta "aceptada" funcione como se desea (vea la foto adjunta, generada al elegir R = 1000, nx = ny = 40). Claramente, mis puntos están mucho más concentrados en los polos y muy poco concentrados a lo largo del ecuador.
¿Alguna sugerencia?
EDITAR: Como referencia, encontré un software que genera una malla tal que cada punto tiene igual "área" a su alrededor (desplácese hacia abajo para ver la distribución uniforme de áreas en una esfera), pero en lugar de implementar su código, fui con una enfoque que consume mucho tiempo: simplemente iteré sobre los ángulos azimutal y polar ([0,2pi] y [0, pi]) y calculé el área '''' infinitesimal '''' de cada parche (da = r ^ 2 sin theta dtheta dphi). Básicamente, esto es todo lo que necesito para la integración en la esfera. Esperaba que la distribución uniforme en el área no fuera tan difícil de implementar.
Existe un software que define una pixelización uniforme de la esfera de tal manera que cada punto está rodeado por la misma cantidad de ángulo sólido. Checkout: http://healpix.jpl.nasa.gov/ También prueban varias rutinas para realizar algunos cálculos útiles en fortan, C, C ++, python, mathlab, entre otros ...
Información de fondo:
Hay 4 pi esteradianos en una esfera, eso es el total de ''grados'' en una esfera, pero uso el término solo en el sentido relativo porque los esteradianos son muy diferentes de los radianes regulares en un círculo, por ejemplo, son tridimensionales y, por lo tanto, son solidos Solo considérenlos como ángulos en forma de helado en una esfera.
http://en.wikipedia.org/wiki/Steradian proporciona un gran ejemplo de ellos.
Tienen una relación directa con el radio, como radianes en un círculo. 1 esteradiano = 1 unidad de radio al cuadrado.
Por lo tanto, primero descubra cuántos elementos deben trazarse en la esfera. Que ese número sea n
. sr
= esteradianos (unidad de medida) = r^2
(radio al cuadrado)
4 pi / n sr = x
x
es la cantidad de esteradianos asignados a cada punto.
Digamos por 4 puntos.
4 pi / 4 sr = x
pi sr = x
Entonces cada punto obtendrá un espacio asignado de pi sr
.
Ahora considere esto ... ya que está trazando puntos, consideraremos que cada punto se colocará en el medio del espacio asignado ... es decir, en el medio del área de forma conal que es lo que es sr
. Ahora necesita considerar algo por un momento, ¿es posible llenar un área completamente con círculos? En serio, piensa en esto ... no es así? Los círculos sólidos siempre dejarán espacio intermedio en ciertos puntos. Piense en un balón de fútbol por un momento. Está construido a partir de formas que pueden unirse para proporcionar una distribución uniforme. El objetivo de este pensamiento es hacer que te des cuenta de que todos los puntos no pueden estar separados a una cierta distancia, como por ejemplo, cómo un círculo tiene un radio. Sin embargo, el centro de los cuadrados de balones de fútbol se acerca mucho y es uniforme.
Lo que haría si fuera usted, sería tratar de escribir un algoritmo para identificar la "forma" más eficiente para colocar cada uno de estos "fragmentos" de espacio esférico asignado en ... como el balón de fútbol. De lo contrario, creo que esta podría ser la mejor respuesta que obtendrás ... 4 pi / n sr = x
..., no hay forma de que se pueda trazar cada punto de manera que sea exactamente la misma distancia entre sí, ( excepto en ciertas configuraciones, es decir, sería posible con un número especial de puntos), puede haber un algoritmo para encontrar todos los casos especiales.
Estoy editando esta respuesta para explicar los casos especiales, creo que una buena información adicional sería buena aquí. Los casos especiales para que los puntos sean equidistantes aparte son que pueden formar los vértices de los sólidos platónicos. Sólo hay 5 formas básicas platónicas sólidas, todas las demás están hechas por éstas.
Lea esta página para obtener más información y una prueba de esto https://www.uwgb.edu/dutchs/symmetry/platonic.htm
Ahora no puedo tomar crédito, hice una investigación rápida y encontré una publicación similar https://math.stackexchange.com/questions/279544/return-an-array-of-evenly-distributed-points-on-a-sphere-give-radius-and-origin
Usando la fórmula del poliedro de Euler http://plus.maths.org/content/eulers-polyhedron-formula
y el hecho de que solo existan tres formas básicas en los poliedros, ''triángulos, cuadrados y hexágonos'' puede crear un algoritmo para redondear el número de puntos que desea trazar, a la forma de poliedro más cercana y trazar cada uno de manera uniforme.
Ah, y eche un vistazo a este gran artículo, explica a los esteradianos y los "grados" tridimensionales mucho mejor que yo. http://mathforum.org/library/drmath/view/55358.html
Podría estar equivocado, pero si
- configura las interacciones entre dos puntos como I (a, b) = (ab) / (| ab |) ^ 3, a, b están amenazados como vectores en el espacio 3D
- para las primeras iteraciones, coloque los puntos como de costumbre (a distancias de ángulo iguales, cómo se ha mencionado en el post wim)
- en cada paso del algoritmo moverá cada punto contra el gradiente de la suma de I (desde 1), donde I se calcula solo en los vecinos directos
- repita 3 hasta que el gradiente en cada punto se convierta en 0.
El algoritmo convergerá a la configuración que necesites. Se está consumiendo tiempo, pero se pueden almacenar en caché los resultados para varios puntos.