我想在一个圆圈内统一分配一组预定的点.通过均匀分布,我的意思是它们应该彼此相等地距离(因此随机方法将不起作用).我尝试了六角形方法,但是我一直遇到问题,一直到达最外半径.
我当前的方法是嵌套for循环,其中每个外部迭代减少了半径和点数,每个内部循环均匀地丢弃新半径上的点.从本质上讲,它是一堆嵌套的圆圈.不幸的是,它远非均匀.有关如何正确执行此操作的任何提示?

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

随着alpha=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)