圆形和矩形碰撞Android

时间:2012-02-17 19:03:32

标签: java android graphics collision-detection physics

我的屏幕上有一个球弹跳,并且有一个静态的矩形,它可以与之碰撞并且应该反弹。我已经想出如何测试球是否与矩形相撞并且效果很好。现在我需要确定球击中的矩形的哪一侧。我目前正在尝试这个代码(用于测试四个方面,但似乎有角落的问题)......

if(Math.abs(ball.centerY-boundingBox.top) < ball.radius) {
    // Hit the top

}
else if(Math.abs(ball.centerY-boundingBox.bottom) < ball.radius) {
    // Hit the bottom

}
else if(Math.abs(ball.centerX-boundingBox.left) < ball.radius) {
    // Hit the left

}
else if(Math.abs(ball.centerX-boundingBox.right) < ball.radius) {
    // Hit the right

}

...有没有人有任何想法如何改善这一点?或者为此提出更好的解决方案?

我基本上需要确定一个圆圈在撞击后撞到矩形的哪一边。而且我已经弄清楚如何测试它们是否发生碰撞。

谢谢!

1 个答案:

答案 0 :(得分:1)

它可能不适用于角落,因为当球击中角落时,它会同时击中两侧。如果你想让它准确地反弹,那么相关的法向矢量就是从球的中心到角落的矢量,这将是水平和垂直之间的一些对角线。

假设你总是在球的中心位于矩形之外时检测到重叠,你可能想要做的是:

// is the ball above the box?
if(Math.abs(ball.ballCenterY-boundingBox.top) < ball.radius)
{
    if(ball.ballCentreX >= boundingBox.left)
    {
         if(ball.ballCentreY <= boundingBox.right)
         {
             // ball hit the top edge
         }
         else
         {
             // ball hit the top right corner
         }
    }
    else
    {
        // hit top left corner
    }
}

更好的测试 - 处理内部和外部碰撞 - 将找到距离每侧最近点的距离,选择最小距离,然后如果最近点是角落然后是角落碰撞,否则它是一侧碰撞。