SFML如何生成随机形状而不使其与其他形状重叠

时间:2020-09-11 18:35:57

标签: c++ codeblocks sfml

我在用代码块在SFML中生成形状时遇到麻烦,并且无法验证其是否重叠了另一种形状,以及是否确实存在重叠,然后尝试在另一位置再次生成它。

代码如下:

srand(time(0));
CircleShape circleObjectArray[50];

for(int i = 0; i < 50; i++)
{
    for(int j = i - 1; j < 49; j++)
    {
    circleObjectArray[i] = CircleShape(rand() % 50 + 5);
    circleObjectArray[i].setPosition(rand() % 1870 + 50, rand() % 1030 + 50);
    circleObjectArray[i].setFillColor(Color(rand() % 255,rand() % 255,rand() % 255));
    if(circleObjectArray[i].getGlobalBounds().intersects( circleObjectArray[j].getGlobalBounds()))
    {
        srand(time(0));
        circleObjectArray[i].setPosition(rand() % 1870 + 50, rand() % 1030 + 50);
        cout << "overlap" << endl;
    }
    }
}

如果我使用一段时间而不是if语句,if将进入无限循环。

反正我可以做这项工作吗?

非常感谢您的时间:D

1 个答案:

答案 0 :(得分:1)

要检查当前生成的形状是否与任何已经生成的形状不相交,您的嵌套循环需要从第一个迭代到先前生成的形状,因此从索引0到上一个生成的索引i - 1,而不是从上一个开始。如果发生重叠,则还需要重置内循环索引j = 0;,以确保新位置不会导致与已经检查的形状重叠。

在检查与先前形状的相交时,无需初始化当前形状。我将这些指令移到了外循环中,因此每个新形状都调用一次。

也不需要多次初始化随机数生成器。我删除了第二个srand(time(0));

其余部分保持不变。

srand(time(0));
CircleShape circleObjectArray[50];

for (int i = 0; i < 50; i++)
{
    circleObjectArray[i] = CircleShape(rand() % 50 + 5);
    circleObjectArray[i].setPosition(rand() % 1870 + 50, rand() % 1030 + 50);
    circleObjectArray[i].setFillColor(Color(rand() % 255, rand() % 255, rand() % 255));

    for (int j = 0; j < i - 1; j++)
    {
        if (circleObjectArray[i].getGlobalBounds().intersects(circleObjectArray[j].getGlobalBounds()))
        {
            circleObjectArray[i].setPosition(rand() % 1870 + 50, rand() % 1030 + 50);
            cout << "overlap" << endl;
            j = 0;
        }
    }
}
相关问题