我的画布是1000x600px。我想在画布外面生成精灵(但是均匀分布)。 检索(-500,-500)和(1500,1100)之间但不在(0,0)和(1000,600)之间的随机值的最佳方法是什么?我知道while循环可用于生成数字,直到它们在范围内,但这似乎是多余的。感谢。
答案 0 :(得分:3)
如果要生成介于-500和1500之间的数字,不包括0到1000,您只需生成0到1000之间的数字(0 - -500 + 1500 - 1000)。
如果数字小于500,则减去500;如果数字大于或等于500,则添加500。
或者更一般地说:
function randomInt(outerMin, outerMax, innerMin, innerMax)
{
var usableRange = innerMin - outerMin + outerMax - innerMax,
threshold = innerMin - outerMin,
num = Math.floor(Math.random() * (usableRange + 1));
if (num < threshold) {
return num - threshold;
} else {
return num - threshold + innerMax;
}
}
randomInt(-500, 1500, 0, 1000);
对于二维点,您必须获得更多创意。首先,您在禁区内生成两个点,然后将这些值传播到好区域:
function randomVector(outer, inner)
{
var innerWidth = inner.right - inner.left,
innerHeight = inner.bottom - inner.top,
x = Math.floor(Math.random() * (innerWidth + 1)),
y = Math.floor(Math.random() * (innerHeight + 1)),
midx = Math.floor(innerWidth / 2),
midy = Math.floor(innerHeight / 2);
if (x < midx) { // left side of forbidden area, spread left
x = x / midx * (inner.left - outer.left) - inner.left;
} else { // right side of forbidden area, spread right
x = (x - midx) / midx * (outer.right - inner.right) + inner.right;
}
if (y < midy) { // top side of forbidden area, spread top
y = y / midy * (inner.top - outer.top) - inner.top;
} else { // bottom side of forbidden area, spread bottom
y = (y - midy) / midy * (outer.bottom - inner.bottom) + inner.bottom;
}
// at this point I'm not sure how to round them
// but it probably should have happened one step above :)
return {
x: Math.floor(x),
y: Math.floor(y)
}
}
randomVector({
left: -500,
top: -500,
right: 1500,
bottom: 1100
}, {
left: 0,
top: 0,
right: 1000,
bottom: 600
});
重要强>
这是有效的,因为“禁止”区域之外的区域在各自的维度上相等,即padding-top == padding-bottom && padding-left == padding-right
。
如果情况不同,则分布不再统一。
答案 1 :(得分:2)
生成一个介于0和1000之间的随机数,如果超过500则添加500(或分别为600),如果没有否定它。
答案 2 :(得分:2)
您可以计算一组允许的矩形,而不是使用一组禁用的矩形。要在任何允许的矩形内获得随机位置,首先选择一个随机矩形,然后在所选矩形内选择一个随机位置。
当重叠不具有相同的大小时,您需要按区域加权,否则较小的矩形将具有比较大的矩形更高的密度(200x100矩形需要是10x20矩形的100倍)。
答案 3 :(得分:0)
只需在(0,0)和(1,1)之间生成这些数字,然后使用一些线性函数进行映射。
否则,将随机坐标所在的区域划分为矩形。假设您获得N个这样的矩形。通过将(0,0)和(1,1)之间的随机生成器的输出映射到该矩形(这是线性映射),可以填充每个矩形。