2

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

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

在此处输入图像描述

对象的中心由点[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 的 y 值四舍五入到 10)。但我根本不知道如何得到这个公式。任何帮助将不胜感激。

4

4 回答 4

3

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

另外,据我所知,场景中的所有对象都是圆形。下面的解决方案不适用于检测圆形和其他形状之间的碰撞。

假设您有两个圆圈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;

}

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

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

于 2013-02-12T19:40:23.163 回答
2

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

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

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

于 2013-02-12T19:15:51.173 回答
1

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

于 2013-02-12T19:18:38.203 回答
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;
}

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

于 2017-03-01T11:56:25.173 回答