答案 0 :(得分:2)
我将遵循的三个可能选择是:
在[400,400]中生成随机坐标,然后检查距离[200,200]的距离是否小于50.如果是,则很好;如果没有,请重新开始。
生成随机极坐标(即角度和距离),距离大于50.然后将它们转换为笛卡尔坐标,以[200,200]为中心并限制在您的区域内......这种方法的问题是它会在矩形区域的四肢引入偏差。
忽略圆圈并用方块绑定,然后使用第一种方法,但使用简化的逻辑。
答案 1 :(得分:1)
一种方法可能是考虑如何将统一的随机数映射到合法的位置。
例如(稍微简化),如果你有一个200 x 200的正方形,并且你想避免中间100x100平方的任何点,你可以为每个坐标做以下事情。生成0到100之间的随机数。如果小于50,则直接使用;否则加100(将其放在150-200范围内)
从概念上讲,这会拉伸中间“洞”周围的范围,同时仍然使得到的点均匀分布。
你的圆圈会比较棘手,因为轴不是独立的,但这种方法的变化值得考虑。 (特别是如果你对随机性只有“软”要求,那么可以放松对分布的限制)。
答案 2 :(得分:0)
我会先从一个以0,0为中心的坐标系开始,然后在生成有效坐标后将它们映射到你的方形/矩形上。
这是一个简单的例子:
function getValidCoordinates() {
var x, y, isValid = false;
while (!isValid) {
x = Math.random() * 400 - 200;
y = Math.random() * 400 - 200;
if (Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) > 50)
isValid = true;
//else alert('too close ' + x + ',' + y);
}
return {x: x + 200, y: y + 200};
}
for (var i=0; i < 10; i++) {
var co = getValidCoordinates();
alert('x=' + co.x + ', y=' + co.y);
}