碰撞检测:圆形物体

时间:2013-02-12 19:05:35

标签: java collision-detection collision geometry angle

我正在开发一个Java游戏(但开发语言并不重要),包括球或圆球等圆形物体,现在正在进行碰撞。 我使用计时器,所以在每一帧我检查是否发生碰撞。

这是一个代表对象右上角的图表。

enter image description here

对象的中心由点[0,0]表示,其半径为10px,单位为像素。

现在,如果我的对象(例如,obj_1)是方形/菱形(蓝线),为了找到另一个(obj_2)是否碰撞它,我只需得到它们的坐标和通过检查Math.abs(obj_1.x - obj_2.x) + Math.abs(obj_1.y - obj_2.y) <= radius我会知道是否发生了碰撞。

但问题是圆形(红线)更棘手,因为它需要更多的空间,这个占用的空间不受直线的限制。当然我必须舍入一些值(例如在上图中,如果我想在x = 2检查碰撞,我将必须舍入y值,看起来像9.5到10)。但我根本不知道如何得到这个公式。任何帮助将非常感激。

4 个答案:

答案 0 :(得分:3)

正如您所提到的那样,实现语言无关紧要,我将为您提供检测圆形对象碰撞的通用解决方案。

另外,根据我收集的内容,场景中的所有对象都是圆圈。以下解决方案不适用于检测圆形与其他形状之间的碰撞。

假设您有两个圈子 c1 c2 。假设相应的半径为 c1.r c2.r ,且中心为(c1.x,c1.y)(c2.x,c2.y),然后以下函数将判断c1和c2是否在碰撞中

boolean areColliding(Circle c1, Circle c2){

   center_distance = sqrt((x1-x2)^2 +(y1-y2)^2);  //this is the distance between the centers of the two circles.

  if((c1.r+c2.r) < center_distance)
           return false;
  else
          return true;

}

如果圆圈发生碰撞,此伪代码函数将返回 true ,否则返回false。

基本上,该功能的作用是检查圆心之间的距离是否大于它们各自半径的总和。

答案 1 :(得分:2)

在Java中,您有一个java.awt.Polygon

Polygon类有多个包含方法和交叉方法。

将圆圈定义为Polygon是一种痛苦,具体取决于您希望圆圈的准确度。但是,一旦将所有对象定义为Polygon,就可以使用定义的方法来检测碰撞。

答案 2 :(得分:1)

您可以在边界框中设置圆形。这将产生不太准确的碰撞,但与其他方法相比具有巨大的性能优势

答案 3 :(得分:1)

@ Ankit解决方案的补充:

boolean areColliding(Circle c1, Circle c2){

    center_distance = (x1-x2)^2 +(y1-y2)^2;  //this is the distance between the centers of the two circles.

    if((c1.r+c2.r)^2 < center_distance)
        return false;
    else
        return true;
}

这只是比较平方距离。结果是一样的,但没有平方根和巨大的性能优势。