在圆圈内均匀分布x点

Mat*_*t K 15 math geometry

我想在一个圆圈内统一分配一组预定的点.通过均匀分布,我的意思是它们应该彼此相等地距离(因此随机方法将不起作用).我尝试了六角形方法,但是我一直遇到问题,一直到达最外半径.

我当前的方法是嵌套for循环,其中每个外部迭代减少了半径和点数,每个内部循环均匀地丢弃新半径上的点.从本质上讲,它是一堆嵌套的圆圈.不幸的是,它远非均匀.有关如何正确执行此操作的任何提示?

嵌套的for循环结果

小智 22

在该区域内均匀分布和在边界冲突上均匀分布的目标; 任何解决方案都将是两者之间的妥协.我用附加参数增加了向日葵种子排列,这个参数alpha表明了人们对边界均匀度的关注程度.

alpha=0 给出典型的向日葵排列,锯齿状边界:

alpha0

随着alpha=2边界是平滑:

α-2

(进一步增加alpha是有问题的:太多的点最终在边界上).

该算法宿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
Run Code Online (Sandbox Code Playgroud)


小智 8

不妨标记一下我的 Python 翻译。

from math import sqrt, sin, cos, pi
phi = (1 + sqrt(5)) / 2  # golden ratio

def sunflower(n, alpha=0, geodesic=False):
    points = []
    angle_stride = 360 * phi if geodesic else 2 * pi / phi ** 2
    b = round(alpha * sqrt(n))  # number of boundary points
    for k in range(1, n + 1):
        r = radius(k, n, b)
        theta = k * angle_stride
        points.append((r * cos(theta), r * sin(theta)))
    return points

def radius(k, n, b):
    if k > n - b:
        return 1.0
    else:
        return sqrt(k - 0.5) / sqrt(n - (b + 1) / 2)


# example
if __name__ == '__main__':
    import matplotlib.pyplot as plt
    fig, ax = plt.subplots()
    points = sunflower(500, alpha=2, geodesic=False)
    xs = [point[0] for point in points]
    ys = [point[1] for point in points]
    ax.scatter(xs, ys)
    ax.set_aspect('equal') # display as square plot with equal axes
    plt.show()
Run Code Online (Sandbox Code Playgroud)