圆内遍布随机点

时间:2018-08-07 12:50:24

标签: javascript math random polar-coordinates

我正在使用以下代码随机生成位于圆内的一些x,y:

// r is distance from the center and a is angle
// R is radius of circle
// M is center

r = R * Math.random();
a = 2 * Math.PI * Math.random();

x = Math.round(r * Math.cos(a) + M);
y = Math.round(r * Math.sin(a) + M);

问题在于,当越来越靠近圆心时,在该位置获得x,y的机会越来越多。

但是我要寻找的只是在圆中到处都是完全随机的x,y。我该如何实现?

3 个答案:

答案 0 :(得分:3)

由于Jacobian,您必须求平方根

r = R *  Math.sqrt(Math.random());

答案 1 :(得分:2)

要在圆内均匀分布点,只需在边长等于2R的正方形中随机选择一个点,然后丢弃圆外的任何点即可。

这可以不用任何三角或超验操作来完成:

let x, y;
do {
    x = 2 * Math.random() - 1.0;  // range [-1, +1)
    y = 2 * Math.random() - 1.0;
} while ((x * x + y * y) >= 1);   // check unit circle

// scale and translate the points
x = x * R + Mx;
y = y * R + My;

在循环的每一遍中,大约21.5%的点将被丢弃,但是最终仍然比使用sincos更快。

答案 2 :(得分:1)

您可以在边缘R的正方形中生成随机的x,y,然后检查它们是否位于圆内。

x = 2 * R * Math.random()
y = 2 * R * Math.random()
r = Math.sqrt((x - M)*(x - M) + (y - M) * (y - M))
if(r < R) {
    // show x,y
}