【问题标题】:Collision detection : rounded object碰撞检测:圆形物体
【发布时间】:2013-01-28 04:37:32
【问题描述】:

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

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

物体的中心用点[0,0]表示,半径为10px,单位为像素。

现在,如果我的对象(例如,obj_1)是方形/菱形(蓝线),要查找另一个对象(obj_2)是否与它发生碰撞,我只需要获取它们的坐标并检查@987654324 @有没有碰撞我会知道的。

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

【问题讨论】:

    标签: java collision-detection collision geometry angle


    【解决方案1】:

    正如你提到的实现语言无关紧要,我会给你一个检测圆形物体碰撞的通用解决方案。

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

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

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

    【讨论】:

      【解决方案2】:

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

      Polygon 类有多个 contains 方法和 intersect 方法。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 2023-03-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-03
            • 2010-09-28
            • 2013-09-09
            相关资源
            最近更新 更多