我想以随机的方式为对象生成一个位置,我不希望它们彼此重叠。
我的屏幕宽度为4.8
米,高度为9.6
米,对象宽度为0.5
,高度为0.5
米。
任何人都可以把我放在正确的方向或任何建议上。
问候
答案 0 :(得分:4)
可能的算法:
1. Choose random coordinates for all objects.
2. Test for overlap. If it occurs, repeat step 1.
可能的改进:
1. Reposition overlapping objects with new random coordinates until there is no
overlap.
2. Shift any overlapping objects to make them not overlap. Do this intelligently
to avoid bunching, if necessary.
答案 1 :(得分:2)
如果您可以将“随机”物体位置放在网格上,那么您可以将空间划分为0.5米乘0.5米的正方形并选取一个正方形。你的世界是9.6米乘4.8米。所以你有一个19 x 8的网格。
将所有网格位置放入列表中。对于要放置的每个对象,从列表中随机选择一个网格位置并将其从列表中删除。
如果要避免严格的网格外观,可以稍微改变网格中心的x和y位置(在此处添加一点)。从逻辑上讲,你仍然有一个网格,但外观不那么规律。
答案 2 :(得分:0)
您没碰巧提到您的编程环境或语言,但假设函数 random()
返回介于0.0和1.0之间的随机值,并假设您将对象放在左上角,你可以使用以下公式:
x = random() * (screenWidth - objectWidth);
y = random() * (screenHeight - objectHeight);
我道歉,你的帖子必须改为阅读相互重叠。当我初步阅读它时,它读取屏幕宽度/高度重叠。
答案 3 :(得分:0)
正如Michael Goldshteyn建议的那样,测试重叠并在重叠发生时生成新坐标是一个很好的解决方案。
如果您只有几个对象,则可以将它们存储在列表中,并为每个新对象测试重叠。
测试重叠的一种方法可能是使用布尔数组,表示屏幕上的每个像素。那么查找会很快。
Btw不是9.6米的大屏幕?
答案 4 :(得分:0)
选项1:
bool found = false;
real x;
real y;
do
{
x = random * (4.8 - 0.5); // Rather make it variables
y = random * (9.6 - 0.5);
found = false;
foreach (obj in objs)
{
if (x > obj.x && x < x+0.5 && y > obj.y && obj.y < y+0.5)
{
found = true;
break;
}
}
}
while (found == true)
选项2: 创建一个代表该场景的2D数组。使类型成为对象的引用。 当你放下时,请参考对象。 如果发生碰撞,您可以检查数组。
使用第二个选项,碰撞检测要快得多,但它会占用更多内存。