Распределение точек, равномерно распределенных внутри сферы - PullRequest
0 голосов
/ 24 января 2019

Я ищу алгоритм для распределения набора точек (может быть от нескольких сотен до миллионов) внутри сферы. В этом случае сфера центрирована в (0,0,0).

Для случайных точек простой метод

repeat
    x:=random*diameter-radius;
    y:=random*diameter-radius;
    z:=random*diameter-radius;
until ((x*x+y*y+z*z)<(radius*radius));

Но я хочу, чтобы точки были равномерно распределены внутри сферы и не группировались на полюсах.

Какие-нибудь хорошие уловки / алгоритмы / формулы / фрагмент кода, чтобы достигнуть этого?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Если вам нужны равномерно распределенные точки - просто поместите их в узлы сетки.

Сфера с радиусом R имеет объем

 V=4/3*Pi*R^3

поэтому для размещения N точек каждой ячейки кубической сетки (возможно, вы захотите использовать гексагональную плотную упаковку) должен иметь объем

v=4/3*Pi*R^3/N

и длина ребра

l = R * (4*Pi/(3*N))^1/3

Затем создайте точки в координатах (a*l, b*l, c*l), где a,b,c - целые числа, ограниченные -R..+R (с соответствующей суммой квадратов).


Предлагаемый подход является довольно грубой оценкой, и, возможно, некоторые из N необходимых точек могут выйти за пределы сферы. В этом случае нужно уменьшить размер ячейки или использовать более точное значение - оно может быть рассчитано с использованием трехмерного аналога формула круга Гаусса ()

0 голосов
/ 24 января 2019

Вы могли бы сделать что-то вроде этого:

  • Поместите центр вашей сферы в случайное положение в бесконечном объеме равномерно распределенных точек, таких как тетраэдрическая или кубическая решетка.

  • Перечислять точки в порядке увеличения расстояния от центра, пока не будет получено правильное число.

  • Масштабировать выбранные точки вокруг центра таким образом, чтобыРасстояние до самой дальней точки равно желаемому радиусу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...