Я создал игру, используя 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));
}
Это должно быть комментарий, но, похоже, моя репутация слишком низкая. Если бы я был вами, я бы проверял метод SAT, так как он действительно крут и может использоваться для проверки разделения между любой фигурой, включая прямоугольник и круг. Вот учебник с примером рабочего исходного кода: http://content.gpwiki.org/VB:Tutorials:Building_A_Physics_Engine:Basic_Intersection_Detection
Также на этом сайте есть несколько действительно интересных примеров того, как это работает: