Равномерно распределить X точек внутри окружности
Я хотел бы равномерно распределить заданный набор точек внутри круга. Под равномерным распределением я имею в виду, что все они должны быть одинаково удалены друг от друга (следовательно, случайный подход не будет работать). Я попробовал гексагональный подход, но у меня были проблемы с последовательным достижением внешнего радиуса.
мой текущий подход-это вложенный цикл for, где каждая внешняя итерация уменьшает радиус и количество точек, а каждый внутренний цикл равномерно отбрасывает точки на новый радиус. По сути, это куча вложенных кругов. К сожалению, это далеко не так. Любые советы о том, как сделать это правильно?
1 ответов
цели иметь равномерное распределение внутри зона и равномерное распределение на конфликте границы; любое разрешение будет компромиссом между 2. Я увеличил семя подсолнуха композиция с дополнительным параметром alpha
это указывает на то, насколько человек заботится о равномерности границы.
alpha=0
дает типичное расположение подсолнечника, с зубчатой границей:
С alpha=2
в граница более гладкая:
(дальнейшее увеличение Альфа проблематично: слишком много точек заканчиваются на границе).
алгоритм местах n
точки, из которых k
- й пункт ставится на расстоянии sqrt(k-1/2)
от границы (индекс начинается с k=1
), и с полярным углом 2*pi*k/phi^2
здесь phi
золотое сечение. Исключение: последнее alpha*sqrt(n)
точки размещают на внешней границе круга, а полярный радиус другой очки масштабируются, чтобы учесть это. Это вычисление полярного радиуса выполняется в функции radius
.
он закодирован в MATLAB.
function sunflower(n, alpha) % example: n=500, alpha=2
clf
hold on
b = round(alpha*sqrt(n)); % number of boundary points
phi = (sqrt(5)+1)/2; % golden ratio
for k=1:n
r = radius(k,n,b);
theta = 2*pi*k/phi^2;
plot(r*cos(theta), r*sin(theta), 'r*');
end
end
function r = radius(k,n,b)
if k>n-b
r = 1; % put on the boundary
else
r = sqrt(k-1/2)/sqrt(n-(b+1)/2); % apply square root
end
end