Math 在圆内均匀分布x点

Math 在圆内均匀分布x点,math,geometry,Math,Geometry,我想在一个圆内均匀地分布一组预定的点。所谓均匀分布,我的意思是它们之间的距离应该相等(因此随机方法不起作用)。我尝试了一种六边形的方法,但我始终无法到达最外面的半径 我目前的方法是嵌套for循环,其中每个外部迭代都会减少半径和点数,每个内部循环都会在新半径上均匀地放置点。本质上,它是一堆嵌套的圆。不幸的是,这还远远不够。有关于如何正确执行此操作的提示吗 区域内均匀分布和边界上均匀分布的目标冲突;任何解决方案都将是两者之间的妥协。我增加了一个额外的参数alpha,表示人们多么关心边界的均匀性 al

我想在一个圆内均匀地分布一组预定的点。所谓均匀分布,我的意思是它们之间的距离应该相等(因此随机方法不起作用)。我尝试了一种六边形的方法,但我始终无法到达最外面的半径

我目前的方法是嵌套for循环,其中每个外部迭代都会减少半径和点数,每个内部循环都会在新半径上均匀地放置点。本质上,它是一堆嵌套的圆。不幸的是,这还远远不够。有关于如何正确执行此操作的提示吗


区域内均匀分布和边界上均匀分布的目标冲突;任何解决方案都将是两者之间的妥协。我增加了一个额外的参数
alpha
,表示人们多么关心边界的均匀性

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

使用
alpha=2
时,边界更平滑:

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

该算法将
n
点放置在距离边界
sqrt(k-1/2)
k
点(索引以
k=1
开始),极角
2*pi*k/phi^2
处,其中
phi
是黄金比例。例外情况:最后一个
alpha*sqrt(n)
点被放置在圆的外边界上,其他点的极性半径被缩放以说明这一点。极半径的计算在函数
radius
中完成

它是用密码写的


无意中发现了这个问题和(因此,请向用户3717023和Matt发送所有凭据)。
只是在这里将我的翻译添加到R中,以防其他人需要:)

库(TIBLE)
图书馆(dplyr)
图书馆(GG2)

sunflower看一看,你想在边界上发生什么,这些点必须均匀地分布在圆的边界上吗?否则,您可以使用统一的网格(三角形、六角形或正方形),只保留圆内的点。感谢RobertDodier,不幸的是,即使是次随机数也不会产生有利的结果,因为2个点彼此靠近的几率仍然相对较高。著名的蓝色雨衣,理想情况下,是的,在这种情况下,我希望最外面的点围绕边缘均匀分布。角度增量使用黄金分割比,半径增量使用平方根。结果看起来不错,但外缘不是完美的圆形。等距点形成六边形晶格,不能位于圆形边界上(N=7除外)。你的要求是不可能的,你必须放松一些条件。这很有效。对于未来的读者,我通过将θ转换为方向角来制作这个测地线,这样我就可以将它转换为目标函数。我用下面的一行
theta=k*(720-360*phi)
做了这件事。它看起来是正确的,但如果我错了,请纠正我。我认为720是多余的;当乘以k时,只有2*k整圈。您可以使用
theta=-k*360*phi
;或者
theta=k*360*phi
因为减号只是镜像反射。再次正确!看起来我需要复习几何知识:-/。你知道如何将其应用到3D中吗?绘制球体内的所有点?
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
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()