11/18
14:30
IT

随机生成圆内均匀分布的点

引用 Generate a random point within a circle (uniformly)

一个很简单的方法是先随机生成正方形内的点,然后判断点是否在圆内,如果不是则重新生成一次重新判断. 不过这个解法不优雅.

随机生成圆内的点我们首先要考虑到圆是个非线性的图形,如果能转变成线性的图形,那么可能会简单些.
联系圆的面积推导也是如此,将圆分解成很多三角形,然后拼凑在一起,就成了近视矩形的线性形状.
因此我们再次考虑将圆分割成很多近似等腰三角形的扇形,接下来我们考虑如何在三角形内随机均匀地生成点就行了.
两个全等的等腰三角形拼接底边可以组成一个菱形(平行四边形),如果我们可以在平行四边形上随机均匀生成一个点,那么,将生成的点沿着底边折叠在一起就是三角形了.
显然,在平行四边形上随机均匀的生成一个点是很容易做到的,只要在相邻的两条边随机均匀地取一个点,过这两个点作平行于边的平行线,交点就会落在平行四边形内部.用向量的思路就是,假设这两个点为P1,p2,平行四边形内部点为O,则满足AO=AP1+AP2.
以上就是整个求解的思路,那么如何应用在圆内呢.
首先我们把圆分割成许多顶角很小的扇形,此时可以近似地认为是等腰三角形,以底边为对称轴作一个全等的等腰三角形,此时我们就得到了平行四边形. 在两个腰上各随机取一点,形成向量AP1,AP2,则AO=AP1+AP2,由于顶角很小,向量和AO可以近似等于标量和的AO. 当AO落在圆外时,我们只需要作对称变换对称回来就行.

以下是代码

def random_point_with_circle():    
    t = 2 * np.pi *random()
    u = random() + random()
    r = u if u < 1 else 2-u
    return r*cos(t), r*sin(t)

发表评论