Обнаружение столкновений между кругом без выравнивания по оси и прямоугольником в C ++ с использованием SFML

0

Я создал игру, используя C++ и графическую библиотеку SFML. Я хочу, чтобы логический метод проверял, есть ли столкновение между sf :: CircleShape и sf :: RectangleShape, если эти два объекта являются параметрами. Проблема в том, что объекты не ориентированы по осям. Как я могу создать метод?

Моя попытка метода (но работает только для выровненных по оси фигур):

bool checkCollision(CircleShape circle, RectangleShape rectangle)
{
        double circleDistanceX = abs(circle.getPosition().x - rectangle.getPosition().x);
        double circleDistanceY = abs(circle.getPosition().y - rectangle.getPosition().y);

        if (circleDistanceX > (rectangle.getSize().x/2 + circle.getRadius()))
        {
                return false;
        }
        if (circleDistanceY > (rectangle.getSize().y/2 + circle.getRadius()))
        {
                return false;
        }

        if (circleDistanceX <= (rectangle.getSize().x/2))
        {
                return true;
        }
        if (circleDistanceY <= (rectangle.getSize().y/2))
        {
                return true;
        }

        double cornerDistance_sq = pow((circleDistanceX - rectangle.getSize().x/2), 2) + pow((circleDistanceY - rectangle.getSize().y/2),2);

        return (cornerDistance_sq <= pow((circle.getRadius()),2));

}
  • 0
    Как круг не может быть выровнен по оси? Конечно, вам просто нужно проверить каждую точку прямоугольника, чтобы узнать, находится ли она внутри круга? Или тест линии на круговое столкновение /
  • 0
    Вот старый пост, который может вам помочь. stackoverflow.com/questions/401847/...
Теги:
sfml

1 ответ

0

Это должно быть комментарий, но, похоже, моя репутация слишком низкая. Если бы я был вами, я бы проверял метод SAT, так как он действительно крут и может использоваться для проверки разделения между любой фигурой, включая прямоугольник и круг. Вот учебник с примером рабочего исходного кода: http://content.gpwiki.org/VB:Tutorials:Building_A_Physics_Engine:Basic_Intersection_Detection

Также на этом сайте есть несколько действительно интересных примеров того, как это работает:

http://www.metanetsoftware.com/technique/tutorialA.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню