Как построить N точек на поверхности D-мерной сферы, примерно равноудаленных друг от друга?
Скажем, у меня есть D-мерная сфера с центром, [C1, C2, C3, C4,... CD] и радиус R. Теперь я хочу построить N число точек, равномерно распределенных (равноудаленных друг от друга) на поверхности сферы. Неважно, где эти точки точно, просто, что они ОТНОСНО равноудалены друг от друга. Я хочу функцию, которая возвращает массив этих точек, P.
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]()
Ответы
Ответ 1
Несколько вариантов:
-
Случайно бросайте точки на сфере и используйте релаксацию Ллойда, чтобы сделать их равномерно распределенными: вы итерационно вычисляете их диаграмму Вороного и перемещаете их к центру своей ячейки Вороного (вместо того, чтобы работать на сфере, вы можете использовать диаграмму евклидовой воронной ограниченный сферой: CGAL может это сделать, например, или ссылаться на мою статью).
-
Если грубое приближение хорошо (т.е. Если равномерно случайное распределение достаточно хорошо), вы можете использовать формулу, объясненную в Wiki: N-Sphere. Если нет, вы можете использовать эту случайную выборку в качестве инициализации вышеприведенного метода
-
Для случайного, но лучшего представления об эквидистантных выборках вы можете создать распределение Пуассона. Быстрый код в высоком размере доступен на главной странице Robert Bridson. Возможно, вам придется адаптировать его для сферического домена.
Ответ 2
Я не знаю, было ли это упомянуто здесь еще; но вы могли бы, как другие предложили нарисовать точки из равномерного распределения на сфере. После этого, проведите каждую точку в соответствии с энергией колумба; используя метод градиентного спуска. Эта особая проблема получила много внимания. Проверьте следующий документ и этот веб-сайт
Ответ 3
Единственный способ, которым я могу думать об этом, должен дать хорошие результаты.
- Создайте N точек на поверхности сферы. Обычный способ сделать это для высоких измерений - создать точки, соответствующие D-мерному нормальному распределению и нормализовать обратно в сферу. Они не будут равномерно распределены - так что нам нужен второй шаг
- Затем каждая точка отталкивает другие точки, используя некоторую функцию отталкивания и используя небольшой временной шаг, вы настраиваете направление движения на касательную к D-сфере. Переместите точку, а затем верните обратно в сферу. Продолжайте делать это до тех пор, пока вы не учтете очки достаточно.