我不会讨论数学与编程的问题。对我来说,这个问题两者都有涉及。下面是我的解释。
您可以尝试将在[0,1]区间生成的点映射到蓝色区域。如果两个形状是同心圆,这应该会给出正态分布。当你有一个正方形时,越靠近对角线的点越稀疏。
这个想法是以极坐标为基础:
1.假设您的图片中心位于笛卡尔坐标系(x,y)位置(0,0)。
2.生成一个在[0,1]区间内的数字a。
3.将此数字转换为角度w = 2 * pi * a。这将是您的极角。方程y = x * tan(w)定义了一条穿过图片中心的直线。
4.现在是棘手的部分:计算允许的径向部分(rho)的极限。它必须大于圆的半径r,并且小于第3步所定义的直线截断正方形的点。
5.会有四种情况,每个正方形边界各一种。 "顶部"边缘是指w值从pi/4到3pi/4的情况;"左侧"是指w值从3pi/4到5pi/4;"底部"的w值在5pi/4到7pi/4之间;而"右侧"的w值从7pi/4到2pi和0到pi/4之间。
6.以顶部直线为例:它位于位置y = s / 2。定义在步骤3中的线与顶边相交的位置是xi tan(w)。
7.笛卡尔点(xi,s / 2)定义了rho的最大值:R = sqrt(xi ^ 2 +(s / 2)^ 2)
8.现在生成另一个在[0,1]区间内的值b
9.将此值映射到[r,R]区间:rho = r + b * R
10.最后得到您的数字X = rho * cos(w)和Y = rho * sin(w),这应该在蓝色区域内。
请注意,从第5步开始,您必须检查应考虑哪个正方形边界(哪个w值)。
如上所述,问题在于对角线比沿着主轴方向更长,导致分布更稀疏。由您来判断这是否是一个问题。请注意,映射不会将点堆积在圆边附近。同时,请自行判断方向检查是否实用(我假设正方形和圆形形状是对您真正想要的内容的粗略近似)。