2012-02-17 148 views
0

我在屏幕上弹起一个球,并且有一个静止的矩形,它可以碰撞并且应该反弹。我已经想出了如何测试球是否与长方形相撞并且效果很好。现在我需要确定球击中矩形的哪一侧。我目前正在此代码(适用于测试四条边,似乎也与角落的问题)......圆形和矩形碰撞Android

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

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

假设你随时检测重叠,同时球的中心是矩形之​​外,你可能想要做的是一样的东西:

// 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 
    } 
} 

一个更好的检验 - 处理内外冲突 - 会找到距离每边最近点的距离,挑选最小距离,然后如果最近点是一个角落,那么它是一个角落的碰撞,否则它是一个侧面碰撞。

+0

你最近发表的关于寻找最近点的评论是我目前正在做我的初始碰撞检测。我喜欢你的想法,如果最近的点是角落。假设它是一个角落,你有什么想法我会去确定哪一方基于这个?假设它不直接走向那个角落。顺便谢谢你的回答! – DRiFTy 2012-02-17 19:25:03

+0

因为角落属于双方,所以没有内在的一面。但是,如果您需要选择一个 - 假设您点击右上角 - 如果从角点到球体中心的矢量更接近垂直,则可能选择顶部边缘,如果接近水平(右边缘这是对x和y坐标的绝对值的比较),并且如果它恰好是45度,则没有偏好。 – Tommy 2012-02-17 20:00:06

+0

好的,我现在已经做到了,所以它在碰到一个角落时会选择一边。只是一个小问题,你可能有一些洞察力......当球在矩形顶部滚动非常缓慢并且即将脱落时,当它到达角落时开始变得有点跳跃。它仍遵循相同的一般路径,但看起来不太合适。虽然角落似乎现在处理得很好,所以谢谢你。 – DRiFTy 2012-02-17 20:09:42