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

时间:2014-01-13 17:31:59

标签: 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);

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

enter image description here

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

2 个答案:

答案 0 :(得分:6)

简单解决方案

你可以简单地遍历所有地图的像素,并且对于给定圆圈内的每个像素 - 以概率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()     

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

更多数学解决方案

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

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()

结果:

uniformly distributed points on the circle

答案 1 :(得分:1)

您可以采用随机x,y值,然后确定它是否属于圆圈内。如果没有,则拒绝并再试一次。当它落在圆圈内时,然后将匹配的匹配数增加一,直到你在圆圈内得到n个随机像素。

少数学,多随机调用。