Как построить 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

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

  1. Создайте N точек на поверхности сферы. Обычный способ сделать это для высоких измерений - создать точки, соответствующие D-мерному нормальному распределению и нормализовать обратно в сферу. Они не будут равномерно распределены - так что нам нужен второй шаг
  2. Затем каждая точка отталкивает другие точки, используя некоторую функцию отталкивания и используя небольшой временной шаг, вы настраиваете направление движения на касательную к D-сфере. Переместите точку, а затем верните обратно в сферу. Продолжайте делать это до тех пор, пока вы не учтете очки достаточно.