我想在一个圆圈内统一分配一组预定的点。通过均匀分布,我的意思是它们应该彼此相等地距离(因此随机方法将不起作用)。我尝试了六边形方法,但是我一直遇到问题,一直到达最外半径。
我当前的方法是嵌套的for循环,其中每个外部迭代减少半径&点数,每个内环均匀地降低新半径上的点。从本质上讲,它是一堆嵌套的圆圈。不幸的是,它远非均匀。有关如何正确执行此操作的任何提示?
答案 0 :(得分:21)
在该区域内均匀分布和在边界冲突上均匀分布的目标;任何解决方案都将是两者之间的妥协。我使用附加参数alpha
扩充了sunflower seed arrangement,该参数表示关注边界均匀度的程度。
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
答案 1 :(得分:0)
偶然发现了这个问题和answer above(所以所有人都相信user3717023和Matt)。
只是在这里将我的翻译添加到R中,以防其他人需要:)
library(tibble)
library(dplyr)
library(ggplot2)
sunflower <- function(n, alpha = 2, geometry = c('planar','geodesic')) {
b <- round(alpha*sqrt(n)) # number of boundary points
phi <- (sqrt(5)+1)/2 # golden ratio
r <- radius(1:n,n,b)
theta <- 1:n * ifelse(geometry[1] == 'geodesic', 360*phi, 2*pi/phi^2)
tibble(
x = r*cos(theta),
y = r*sin(theta)
)
}
radius <- function(k,n,b) {
ifelse(
k > n-b,
1,
sqrt(k-1/2)/sqrt(n-(b+1)/2)
)
}
# example:
sunflower(500, 2, 'planar') %>%
ggplot(aes(x,y)) +
geom_point()