Ответ 1
Цели обеспечения равномерного распределения в пределах района и равномерного распределения на граничном конфликте; любое решение будет компромиссом между ними. Я увеличил сеяние семян подсолнечника с дополнительным параметром 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