环形区域随机点生成两种方案的分布差异原因解析
环形区域内生成均匀随机点的两种方案差异解析
在由minRadius和maxRadius构成的环形区域内生成随机点时,常用转换公式为:
x = x' + r*cos(a) y = y' + r*sin(a)
其中(x', y')是环形的原点,r是点到原点的距离,a是点对应的角度。下面解析两种生成方案的差异:
第一种方案:点偏向中心的本质原因
方案代码
function get_point_in_circle(x', y', minRadius, maxRadius) { var a = random(360); var r = random_range(minRadius, maxRadius); return { x : x' + r * cos(a), y : y' + r * sin(a), } }
偏向中心的原因
这个方案的问题出在半径r的采样方式:它直接在[minRadius, maxRadius]范围内均匀取随机值,但环形区域的面积分布是随半径增大而增加的——半径为r附近的环形细带,面积是2πrΔr,也就是说,半径越大,对应的环形带面积越大。
如果要实现均匀分布,落在每个环形带里的点数量应该和带的面积成正比。但这个方案里,不管是小半径还是大半径的环形带,被选中的概率是一样的,导致小半径区域(靠近中心)的点密度远高于大半径区域,最终呈现出点偏向中心的结果,这不是视觉错觉,是实际的密度分布问题。
第二种方案:实现均匀分布的逻辑
方案代码
x = random_range(-maxRadius, maxRadius); y = random_range(-maxRadius, maxRadius); // 筛选出到原点距离在(minRadius, maxRadius)之间的点
均匀分布的原因
这个方案是先在以原点为中心、边长为2*maxRadius的正方形区域内均匀生成随机点,再过滤掉不在目标环形里的点。
正方形内的均匀采样,本质是平面上的面积均匀分布——每个单位面积内的点数量相同。过滤后,留在环形区域内的点自然也保持了这种均匀性:大半径附近的环形带面积大,自然会留下更多点;小半径区域面积小,留下的点也更少,完全符合环形区域内均匀分布的要求,所以不会出现偏向中心的情况。
内容的提问来源于stack exchange,提问作者Game Development
相关产品推荐
相关产品推荐

