我正在使用以下代码随机生成位于圆内的一些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。我该如何实现?
答案 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%的点将被丢弃,但是最终仍然比使用sin
和cos
更快。
答案 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
}