随机放置矩形但不在中心的x半径范围内

时间:2011-11-08 10:26:59

标签: javascript math raphael

如何在一个舞台上随机放置具有可变宽度和高度的矩形,但是远离半径为x的中心的圆

提前致谢

修改

到目前为止检查我的代码

http://jsfiddle.net/chchrist/cAShH/1/

3 个答案:

答案 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);
}