Разброс n точек равномерно на сфере

Я пытаюсь разогнать n точек на сфере, так что каждая точка имеет "ту же" область "вокруг". В принципе, я пытаюсь интегрировать функцию по сфере, оценивая в n точках и предполагая, что каждый элемент области один и тот же (и равен 4pi r ^ 2/n).

Мой вопрос очень связан с этим, но я не могу согласиться с тем, что код, представленный в "принятом" ответе, работает по желанию (см. прилагаемый фото, генерируемое выбором R = 1000, nx = ny = 40). Ясно, что мои точки гораздо более сосредоточены на полюсах и очень не сосредоточены вдоль экватора.

Любые предложения?

EDIT: Для справки я нашел некоторое программное обеспечение, которое генерирует сетку, так что каждая точка имеет равный "area" вокруг нее (прокрутка вниз, чтобы увидеть распределение однородной области на сфере), но вместо того, чтобы реализовать свой код, я пошел с менее трудоемким подходом: я просто повторил по азимутальным и полярным углам ([0,2pi] и [0, pi]) и вычислил "бесконечно малую" площадь каждого патча (da = r ^ 2 sin theta dtheta dphi). Это в основном все, что мне нужно для интеграции в сферу, я просто надеялся, что распределение однородной области не будет так сложно реализовать.

Ответ 1

Фоновая информация:

В сфере есть 4 pi steradians, что полные "градусы" в сфере, но я использую этот термин только в относительном смысле, потому что стерадиан сильно отличается от обычных радианов по кругу, для одного они равны 3 и поэтому являются твердыми. Просто рассматривайте их как углы мороженого в сфере. enter image description here

http://en.wikipedia.org/wiki/Steradian предоставляет отличный пример.

Они имеют прямое отношение к радиусу, например, радиан по кругу. 1 steradian = 1 единица квадрата радиуса.

Итак, сначала выясните, сколько предметов нужно рисовать на сфере. Пусть это число n. sr= steradians (единица измерения) = r^2 (квадрат радиуса)

4 pi / n sr = x

x - сколько стерадиан выделяется для каждой точки.

скажем, для 4 точек.

4 pi / 4 sr = x

pi sr = x Таким образом, каждая точка получит выделенное пространство pi sr.

Теперь рассмотрим это... так как вы рисуете точки, мы будем считать, что каждая точка будет помещена в середину выделенного пространства... то есть в середине области формы, которая имеет форму конуса, что и есть sr есть. Теперь вам нужно что-то рассмотреть на мгновение, можно ли заполнить область полностью кругами? Серьезно, подумайте об этом... это не так? Твердые круги всегда оставляют пространство между ними в определенных местах. Подумайте о футбольном мяче на мгновение. Он построен из форм, которые могут объединяться для обеспечения равномерного распределения. Суть этой мысли заключается в том, чтобы вы поняли, что все точки не могут быть точно на определенном расстоянии друг от друга - например, как круг имеет радиус. Тем не менее, центр квадратов футбольного мяча приближается и является однородным.

Что бы я сделал, если бы я был вами, было бы попытаться написать алгоритм для определения наиболее эффективной "формы", чтобы поместить каждый из этих "кусков" выделенного сферического пространства в... как футбольный мяч. В противном случае, я думаю, что это лучший ответ, который вы получите... 4 pi / n sr = x..., нет никакой возможности для каждой точки быть построенной так, чтобы она находилась на одинаковом расстоянии друг от друга (за исключением некоторых конфигураций, т.е. было бы возможно со специальным числом точек), там можно найти алгоритм для нахождения всех особых случаев.

Я редактирую этот ответ, чтобы подробно рассказать об особых случаях, я думаю, что немного дополнительной информации было бы неплохо. Особые случаи для точек, которые должны быть равноудалены друг от друга, заключаются в том, что они могут образовывать вершины платоновых тел. Есть только 5 основных платонических твердых фигур, все остальные сделаны ими.

Прочтите эту страницу для получения дополнительной информации и доказательства этого https://www.uwgb.edu/dutchs/symmetry/platonic.htm

Теперь я не могу взять кредит, я сделал несколько быстрых исследований и нашел аналогичную должность https://math.stackexchange.com/questions/279544/return-an-array-of-evenly-distributed-points-on-a-sphere-give-radius-and-origin

Используя формулу многогранника Эйлера http://plus.maths.org/content/eulers-polyhedron-formula

и тот факт, что существуют только три основные формы на многогранниках, "треугольники, квадраты и шестиугольники", вы можете создать алгоритм для округления числа точек, которые вы хотите построить, до ближайшей формы многогранника и построить каждый из них равномерно.

enter image description here

О, и взгляните на эту замечательную статью, она объясняет, что стерадиан и трехмерные "степени" намного лучше, чем я. http://mathforum.org/library/drmath/view/55358.html

Ответ 2

Вот примерный алгоритм, который я просто взбивал в 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()

enter image description here

Опять же, 10000 очков:

enter image description here

Ответ 3

Может быть неправильно, но если

  • устанавливают взаимодействия между двумя точками, поскольку я (a, b) = (a-b)/(| a-b |) ^ 3, a, b находятся под угрозой как векторы в трехмерном пространстве
  • для первых итераций точки места как обычно (на равных угловых расстояниях, как это упоминалось в сообщении wim)
  • на каждом шаге алгоритма вы будете перемещать каждую точку против градиента суммы я (из 1.), где я рассчитывается только на прямых соседях
  • повторите 3 до тех пор, пока градиент в каждой точке не станет 0.

алгоритм сходится к конфигурации, что вам нужно. Это требует времени, но вы можете кэшировать результаты для различного количества точек.

Ответ 4

Что касается ответа Клика, предпосылка верна, но формула неверна. Если бы формула была n/4pi, то если бы у вас было 4 балла, результат был бы 4/(4 × pi), который равен 0,3183 (не pi). То, что вы хотите сделать, - взять общее количество стерданов на сфере (т.е. 4pi) и разделить его на n раз. Эта формула равна 4pi/n.

Ответ 5

Существует программное обеспечение, которое определяет равномерную пикселизацию сферы таким образом, что каждая точка окружена одинаковым количеством телесного угла. Проверять, выписываться: http://healpix.jpl.nasa.gov/ Они также предлагают несколько подпрограмм, чтобы сделать некоторые полезные вычисления в fortan, C, С++, python, mathlab и других...