Равномерно распределить х точек внутри круга

Я хотел бы равномерно распределить заданный набор точек внутри круга. По равномерному распределению я имею в виду, что все они должны быть одинаково дистанцированы друг от друга (следовательно, случайный подход не будет работать). Я попробовал шестиугольный подход, но у меня были проблемы, последовательно достигающие самого дальнего радиуса.

Мой текущий подход - это вложенный цикл, где каждая внешняя итерация уменьшает радиус и количество точек, и каждый внутренний цикл равномерно опускает точки на новый радиус. По сути, это куча вложенных кругов. К сожалению, это далеко не так. Любые советы о том, как это сделать правильно?

Nested for-loop result

Ответ 1

Цели обеспечения равномерного распределения в пределах района и равномерного распределения на граничном конфликте; любое решение будет компромиссом между ними. Я увеличил сеяние семян подсолнечника с дополнительным параметром alpha, который указывает, сколько нужно заботиться о равномерности границы.

alpha=0 дает типичное устройство подсолнечника с зубчатой ​​границей:

alpha0

С alpha=2 граница более гладкая:

alpha2

(Увеличение альфа еще проблематично: слишком много точек заканчивается на границе).

Алгоритм помещает 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