利用SFML进行C ++中非轴对齐圆与矩形的碰撞检测

时间:2014-02-02 21:27:10

标签: c++ sfml

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

}

1 个答案:

答案 0 :(得分:0)

这应该是一个评论,但似乎我的声誉太低了。 如果我是你,我会检查SAT方法,因为它非常酷,可以用来检查任何形状,包括矩形和圆形之间的分离。这是一个包含工作源代码示例的教程: http://content.gpwiki.org/VB:Tutorials:Building_A_Physics_Engine:Basic_Intersection_Detection

此网站还有一些非常酷的例子:

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