2

Hello I'm new to C++ SFML. I'm supposed to draw some rectangles and render their AABB while rotating and I want to detect if the dimensions set for them intersect another rotating AABB rectangle. Here is what I use to detect them. Is it enough to check it that way if theyre rotating? would i need to use stuff like the separating axis theorem? or is there a way to not need to use that if its just an AABB than an OBB

#define RECT 5

sf::RectangleShape Rect[RECT];
Rect[0].setSize(sf::Vector2f(50.0f, 50.0f));
Rect[1].setSize(sf::Vector2f(50.0f, 100.0f));
Rect[2].setSize(sf::Vector2f(60.0f, 80.0f));
Rect[3].setSize(sf::Vector2f(100.0f, 60.0f));
Rect[4].setSize(sf::Vector2f(30.0f, 250.0f));

sf::Vector2f MinPoint[RECT];
sf::Vector2f MaxPoint[RECT];

for (int x = 0; x < RECT; x++)
{
    //Starting Position
    Rect[x].setOrigin(Rect[x].getSize().x / 2, Rect[x].getSize().y / 2);
    xpos += 150;
    Rect[x].setPosition(xpos, ypos);
    colcount++;
    if (colcount == 3)
    {
        xpos = 0;
        ypos += 200;
        colcount = 0;
    }

    Rect[x].setFillColor(sf::Color::Red);

}


while (window.isOpen())
{
    window.clear(sf::Color::Black);
    //Drawing Shapes
    for (int x = 0; x < RECT; x++)
    {
        window.draw(Rect[x]);
    }

    Rect[0].rotate(90*3.14/180);
    Rect[1].rotate(12 * 3.14 / 180);
    Rect[2].rotate(10 * 3.14 / 180);
    Rect[3].rotate(180 * 3.14 / 180);
    Rect[4].rotate(360 * 3.14 / 180);


    for (int i = 0; i < RECT; i++)
    {
        MinPoint[i].x = Rect[i].getPosition().x - (Rect[i].getSize().x / 2);
        MaxPoint[i].x = Rect[i].getPosition().x + (Rect[i].getSize().x / 2);
        MinPoint[i].y = Rect[i].getPosition().y - (Rect[i].getSize().y / 2);
        MaxPoint[i].y = Rect[i].getPosition().y + (Rect[i].getSize().y / 2);
    }


    //Collision Detection
    for (int i = 0; i < RECT; i++)
    {
        for (int j = i + 1; j < RECT; j++)
        {
            if (i != j)
            {
                if (MaxPoint[i].x >= MinPoint[j].x && MaxPoint[j].x >= MinPoint[i].x && MaxPoint[i].y >= MinPoint[j].y && MaxPoint[j].y >= MinPoint[i].y)
                {
                    Rect[i].setFillColor(sf::Color::Green);
                    Rect[j].setFillColor(sf::Color::Green);
                }
            }
        }
    }
MLG Chan
  • 61
  • 4

1 Answers1

0

Apparently all I needed to do was make another set of transparent rectangles with outlines that were set at the same position as my rotating rectangle boxes then set their sizes to getGlobalBounds of my rotating rectangles. the collision check would then instead be put under these transparent bounding boxes instead of the rotating rectangle itself.

#define RECT 5

sf::RectangleShape Rect[RECT];
sf::RectangleShape AABB[RECT];
Rect[0].setSize(sf::Vector2f(50.0f, 50.0f));
Rect[1].setSize(sf::Vector2f(50.0f, 100.0f));
Rect[2].setSize(sf::Vector2f(60.0f, 80.0f));
Rect[3].setSize(sf::Vector2f(100.0f, 60.0f));
Rect[4].setSize(sf::Vector2f(30.0f, 250.0f));

sf::Vector2f MinPoint[RECT];
sf::Vector2f MaxPoint[RECT];

for (int x = 0; x < RECT; x++)
{
    //Starting Position
    Rect[x].setOrigin(Rect[x].getSize().x / 2, Rect[x].getSize().y / 2);
    AABB[x].setOrigin(AABB[x].getSize().x / 2, AABB[x].getSize().y / 2);
    xpos += 150;
    Rect[x].setPosition(xpos, ypos);
    AABB[x].setSize(sf::Vector2f(Rect[x].getGlobalBounds().width, Rect[x].getGlobalBounds().height));
    AABB[x].setPosition(Rect[x].getPosition().x, Rect[x].getPosition().y);
    colcount++;
    if (colcount == 3)
    {
        xpos = 0;
        ypos += 200;
        colcount = 0;
    }

    Rect[x].setFillColor(sf::Color::Red);
    AABB[x].setFillColor(sf::Color::Transparent);
    AABB[x].setOutlineThickness(1);
    AABB[x].setOutlineColor(sf::Color::White);

}


while (window.isOpen())
{
    window.clear(sf::Color::Black);
    //Drawing Shapes
    for (int x = 0; x < RECT; x++)
   {
        window.draw(Rect[x]);
        window.draw(AABB[x]);
   }

    //Rotation
    Rect[0].rotate(1);
    Rect[1].rotate(45);
    Rect[2].rotate(11.25);
    Rect[3].rotate(5.625);
    Rect[4].rotate(22.5);

   for (int i = 0; i < RECT; i++)
   {
        MinPoint[i].x = AABB[i].getPosition().x - (AABB[i].getSize().x / 2);
        MaxPoint[i].x = AABB[i].getPosition().x + (AABB[i].getSize().x / 2);
        MinPoint[i].y = AABB[i].getPosition().y - (AABB[i].getSize().y / 2);
        MaxPoint[i].y = AABB[i].getPosition().y + (AABB[i].getSize().y / 2);

        AABB[i].setOrigin(AABB[i].getSize().x / 2, AABB[i].getSize().y / 2);
        AABB[i].setSize(sf::Vector2f(Rect[i].getGlobalBounds().width, Rect[i].getGlobalBounds().height));
        AABB[i].setPosition(Rect[i].getPosition().x, Rect[i].getPosition().y);
   }


   //Collision Detection
   for (int i = 0; i < RECT; i++)
   {
       for (int j = i + 1; j < RECT; j++)
       {
           if (i != j)
           {
               if (MaxPoint[i].x >= MinPoint[j].x && MaxPoint[j].x >= MinPoint[i].x && MaxPoint[i].y >= MinPoint[j].y && MaxPoint[j].y >= MinPoint[i].y)
               {
                    Rect[i].setFillColor(sf::Color::Green);
                    Rect[j].setFillColor(sf::Color::Green);
                    AABB[i].setOutlineColor(sf::Color::Blue);
                    AABB[j].setOutlineColor(sf::Color::Blue);
               }
           }
       }
   }
MLG Chan
  • 61
  • 4