使用SFML在C 中的非轴对准圆和矩形之间的碰撞检测

Collision Detection Between Non Axis-Aligned Circle and Rectangle in C++ using SFML

本文关键字:碰撞检测 之间 SFML 使用      更新时间:2023-10-16

我一直在使用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

此网站也有一些非常酷的示例,涉及其工作原理:

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