在圆圈内均匀分布x点

时间:2015-02-17 17:15:55

标签: math geometry

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

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

Nested for-loop result

2 个答案:

答案 0 :(得分:21)

在该区域内均匀分布和在边界冲突上均匀分布的目标;任何解决方案都将是两者之间的妥协。我使用附加参数alpha扩充了sunflower seed arrangement,该参数表示关注边界均匀度的程度。

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

alpha0

使用alpha=2边界更平滑:

alpha2

(进一步增加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()