Я заинтересован в равномерном распределении N точек на поверхности сфер размером 3 и выше.
Чтобы быть более конкретным:
- Дано количество точек N и количество измерений D (где D> 1, N> 1)
- Расстояние каждой точки до начала координат должно быть 1
- Минимальное расстояние между любыми двумя точками должно быть как можно большим
- Расстояние каждой точки до ее ближайшего соседа не обязательно должно быть одинаковым для каждой точки (в действительности, она не может быть одинаковой, если только число точек не образует вершин платонового тела или если N & lt; = D).
Я не заинтересован в:
- Создание равномерного случайного распределения в гиперсфере, потому что я хочу, чтобы минимальное расстояние между любыми двумя точками было как можно большим, а не случайным образом распределенным.
- Методы типа имитации отталкивания частиц, потому что их сложно реализовать и они требуют очень много времени для запуска при больших N (в идеале метод должен быть детерминированным и иметь O (n)).
Один метод, который удовлетворяет этим критериям, называется решеткой Фибоначчи, но мне удалось найти только реализации кода для этого в 2d и 3d.
Метод, лежащий в основе решетки Фибоначчи (также называемой спиралью Фибоначчи), заключается в создании 1d-линии, которая проходит по спирали вокруг поверхности сферы, так что площадь поверхности, покрываемая этой линией, примерно одинакова на каждом повороте. Затем вы можете отбросить N точек, равномерно распределенных по спирали, и они будут примерно равномерно распределены по поверхности сферы.
В этом ответе есть реализация Python для 3-х измерений, которая генерирует следующее:
Я хотел знать, можно ли расширить спираль Фибоначчи до размеров выше 3, и разместил вопрос на бирже математического стека. К моему удивлению, я получил два удивительных ответа, которые, насколько я могу судить (поскольку я не полностью понимаю показанную математику), действительно показывают, что этот метод действительно можно расширить до N измерений.
К сожалению, я не понимаю достаточно математики, показанной, чтобы можно было превратить любой ответ в (псевдо) код. Я опытный программист, но мой математический опыт до сих пор так далеко.
Я скопирую то, что я считаю самой важной частью одного из ответов ниже (к сожалению, SO не поддерживает mathjax, поэтому мне пришлось копировать в виде изображения)
Трудности, представленные вышеизложенным, с которыми я борюсь:
- Как разрешить обратную функцию, используемую для ψn?
- Пример приведен для d = 3. Как создать формулы для произвольного d?
Сможет ли кто-нибудь здесь, кто понимает математические методы, добиться прогресса в реализации псевдокода любого ответа на вопрос о решетке связанной Фибоначчи? Я понимаю, что полная реализация может быть довольно сложной, поэтому я был бы доволен реализацией части, которая уводит меня достаточно далеко, чтобы я мог завершить остальную часть самостоятельно.
Чтобы сделать это проще, я уже кодировал функцию, которая принимает сферические координаты в N измерениях и превращает их в декартовы координаты, поэтому реализация может выводить любую из них, которую я могу легко преобразовать.
Кроме того, я вижу, что один ответ использует следующее простое число для каждого дополнительного измерения. Я могу легко написать функцию, которая выводит каждое последующее простое число, поэтому вы можете предположить, что она уже реализована.
Если бы не было реализации решетки Фибоначчи в N измерениях, я был бы рад принять другой метод, который удовлетворяет вышеуказанным ограничениям.