如何以圆形形式均匀地传播点

Edu*_*ard 7 php math trigonometry

我已经搜索了类似于这个问题的一些问题,但没有一个问题我遇到了同样的问题.我有一个单位的地图,1000x1000单位,把它想象成像素.问题是我必须将圆形均匀地分布到1000x1000地图中,所有我想到的就是这样:

$quadrant = array_search(min($quadrants), $quadrants); // the quadrant with less points
$radius = (current_points_number / sqrt(pi() / $points_density);
$angle = pi() * mt_rand() / 2 / mt_getrandmax();
$x = round((($quadrant == 2 || $quadrant == 3) ? -1 : 1) * cos($angle) * $radius + 500);
$y = round((($quadrant == 3 || $quadrant == 4) ? -1 : 1) * sin($angle) * $radius + 500);
Run Code Online (Sandbox Code Playgroud)

正如你在下一张图片中看到的那样,这个实际算法的结果是一个问题,因为它倾向于使点更密集于圆的中心并广泛分散在它的边缘.

在此输入图像描述

任何建议都将受到高度赞赏.

lej*_*lot 7

简单解决方案

你可以简单地遍历所有地图的像素,并且对于给定圆圈内的每个像素 - 以概率P``创建单位,所以代码类似于

for x=1 to max_x
  for y=1 to max_y
    if (x-circle_x)^2 + (y-circle_y)^2 <= circle_r^2
      if random() < P
        map[x][y] = new unit()     
Run Code Online (Sandbox Code Playgroud)

显然它不是最优的,因为你不需要通过非圆点迭代,但这应该给你一般的想法.很容易证明它产生均匀分布,因为它只是在整个地图上生成均匀分布并从圆外部"移除"单位.

更多数学解决方案

您也可以通过迭代应用均匀分布的点生成器以更严格的方式执行此操作:

for i in 1...numer_of_units_to_generate:
  t = 2*pi*random()
  u = random()+random()
  if u>1 then 
    r=2-u 
  else 
    r=u
  map[r*cos(t)][r*sin(t)]=new unit()
Run Code Online (Sandbox Code Playgroud)

结果:

圆上均匀分布的点