创建 X 数量的矩形,这些矩形在指定的屏幕尺寸上彼此不相交

Creating an X amount of rectangles which are not intersecting each other on a specified screen size

我在一些帮助下设法知道当两个矩形彼此相交时,从那里应该很容易做出我刚才在标题中所说的,但是...

所以,下面是我刚刚所做的小故事: 创建了一个从 1 到 Number_of_Obstacles 的 for 循环 因为创建了一个随机障碍物 (rectangle/square) 并且将检查它是否与从 0 到循环控制器创建的所有其他障碍物重叠(或者换句话说,向量中存储的每个障碍物)

doOverLap 函数再次起作用。用我制作控制器的正方形和在屏幕上创建的其他随机矩形对其进行测试。当我重叠它时它会在聊天中输出并相信我,我从各个角度重叠它。

这是一张有重叠问题的图片:https://imgur.com/a/ZzorOcD

bool doOverlap(A a, B b)
{
    if (a.x1 > b.x2 || b.x1 > a.x2)
        return false;
    if (a.y1 > b.y2 || b.y1 > a.y2)
        return false;
    return true;
}

struct Obstacles {
    int X, Y;
void Create_Random_Obstacles(Obstacles Obj[], int Numar_Obstacole)
{
    srand(time(NULL));

    A Rectangle_1;
    B Rectangle_2;

    /* To avoid rendering outside of the screen */
    int X_Axis = X_RESOLUTION - 40;
    int Y_Axis = Y_RESOLUTION - 40;

    int obstacolX = rand() % X_Axis + 1;
    int obstacolY = rand() % Y_Axis + 1;

    Obj[0].X = obstacolX;
    Obj[0].Y = obstacolY;

    for (int i = 1; i < Numar_Obstacole; i++)
    {
        obstacolX = rand() % X_Axis + 1;
        obstacolY = rand() % Y_Axis + 1;

        Rectangle_1.x1 = obstacolX;
        Rectangle_1.x2 = obstacolX + 40;
        Rectangle_1.y1 = obstacolY;
        Rectangle_1.y2 = obstacolY + 40;

        for (int j = 0; j < i; j++) {
            Rectangle_2.x1 = Obj[j].X;
            Rectangle_2.x2 = Obj[j].X + 40;
            Rectangle_2.y1 = Obj[j].Y;
            Rectangle_2.y2 = Obj[j].Y + 40;

            if (doOverlap(Rectangle_1, Rectangle_2))
            {
                std::cout << "Overlap\n";
            }
            else
            {
                Obj[i].X = obstacolX;
                Obj[i].Y = obstacolY;
            }
        }   
    }
}

void Render(SDL_Renderer* renderer, Obstacles Obj[], int Numar_Obstacole) {
    for (int i = 0; i < Numar_Obstacole; i++) 
    {
        SDL_Rect r{ Obj[i].X, Obj[i].Y, 40, 40 };
        SDL_SetRenderDrawColor(renderer, 255, 160, 15, 255);
        SDL_RenderFillRect(renderer, &r);
    }
}

};

发生碰撞时重新选择,类似于:

bool Has_Overlap(const Obstacles& obj, const Obstacles* Objs, int Size)
{
    B Rectangle_2;
    Rectangle_2.x1 = obs.X;
    Rectangle_2.x2 = obs.X + 40;
    Rectangle_2.y1 = obs.Y;
    Rectangle_2.y2 = obs.Y + 40;
    for (int i = 0; i != Size; ++i) {
        A Rectangle_1;
        Rectangle_1.x1 = Obs[i].X;
        Rectangle_1.x2 = Obs[i].X + 40;
        Rectangle_1.y1 = Obs[i].Y;
        Rectangle_1.y2 = Obs[i].Y + 40;
        if (doOverlap(Rectangle_1, Rectangle_2)) {
            return true;
        }
    }
    return false;
}

void Create_Random_Obstacles(Obstacles* Objs, int Size)
{
    /* To avoid rendering outside of the screen */
    const int X_Axis = X_RESOLUTION - 40;
    const int Y_Axis = Y_RESOLUTION - 40;

    for (int i = 0; i < Size; i++)
    {
        do {
            Objs[i].X = rand() % X_Axis + 1;
            Objs[i].Y = rand() % Y_Axis + 1;
        } while (Has_Overlap(Objs[i], Objs, i));
    }
}