2013-02-12 87 views
2

我正在开发一个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处的碰撞,我将不得不围绕看起来像9.5到10的y值)。但我根本不知道如何得到这个公式。任何帮助将非常感激。

回答

2

正如您所提到的,实现语言并不重要,我会为您提供检测圆形对象碰撞的通用解决方案。

另外,从我收集的情况来看,场景中的所有对象都是圆圈。下面的解决方案不适用于检测圆和其他形状之间的碰撞。

假设你有两个圆圈c1c2。假设相应的半径是c1.rc2.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; 

} 

这个伪代码函数将返回如果圆圈碰撞,否则为false。

基本上,函数做的是检查圆心的距离是否大于它们各自的半径之和。

+1

完美,很好,完美解决了它。非常感谢! – Rob 2013-02-12 20:06:12

2

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

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

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

1

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

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

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