一尘不染

圆圆碰撞

algorithm

我要开发一个二维球游戏,其中两个球(圆)碰撞。现在,我遇到了确定碰撞点的问题(实际上是确定它们是否在x轴/
y轴上碰撞)。我有一个想法,当2个球的y坐标之间的差大于x坐标差时,它们将在y轴上碰撞,否则,它们将在x轴上碰撞。我的想法正确吗?我在游戏中实现了这个东西。通常,它运作良好,但有时会失败。谁能告诉我我的想法是否正确?如果不是,那为什么呢,还有更好的方法吗?

x轴上的碰撞是指圆的第1、4、5或8个八分圆,y轴是指圆的第2、3、6、7号圆。

提前致谢!


阅读 218

收藏
2020-07-28

共1个答案

一尘不染

圆圈之间的碰撞很容易。想象有两个圈子:

  • 具有中心(x1,y1)和半径r1的C1;
  • 具有中心(x2,y2)和半径r2的C2。

想象一下,在这两个中心点之间有一条直线。根据定义,从中心点到每个圆的边缘的距离等于它们各自的半径。所以:

  • 如果圆的边缘接触,则中心之间的距离为r1 + r2;
  • 更远的距离,圆圈不会碰触或碰撞;和
  • 然后减少碰撞。

因此,您可以在以下情况下检测碰撞:

(x2-x1)^2 + (y1-y2)^2 <= (r1+r2)^2

表示中心点之间的距离小于半径的总和。

可以将相同原理应用于检测三维球体之间的碰撞。

编辑: 如果要计算碰撞点,则可以使用一些基本的三角函数来实现。你有一个三角形:

        (x1,y1)
        |\
        | \
        |  \ sqrt((x2-x1)^2 + (y2-y1)^2) = r1+r2
|y2-y1| |   \
        |    \
        |   X \
(x1,y2) +------+ (x2,y2)
         |x2-x1|

表达式|x2-x1||y2-y1|是绝对值。因此对于角度X:

        |y2 - y1|
sin X =  -------
         r1 + r2

        |x2 - x1|
cos X =  -------
         r1 + r2

        |y2 - y1|
tan X =  -------
        |x2 - x1|

一旦有了角度,就可以通过将它们应用于新三角形来计算相交点:

  +
  |\
  | \
b |  \ r2
  |   \
  |  X \
  +-----+
     a

哪里:

        a
cos X = --
        r2

所以

a = r2 cos X

根据以前的公式:

       |x2 - x1|
a = r2 -------
        r1 + r2

一旦有了a和b,就可以根据(x2,y2)偏移(a,b)的方式计算碰撞点。您甚至不需要为此计算任何正弦,余弦或反正弦或余弦。或与此相关的任何平方根。这样很快。

但是,如果您不需要精确的碰撞角度或碰撞点,而只想八分圆,您可以通过了解切线的一些知识来进一步优化它,即:

  • 0 <= tan X <= 1表示0 <= X <= 45度;
  • tan X> = 1表示45 <= X <= 90
  • 0> = tan X> = -1表示0> = X => -45;
  • tan X <= -1表示-45> = X => -90; 和
  • 棕褐色=棕褐色(X + 180)=棕褐色(X-180)。

这四个度范围对应于圆的四个八分圆。其他四个偏移180度。如上所示,正切可以简单地计算为:

        |y2 - y1|
tan X =  -------
        |x2 - x1|

丢失绝对值,该比率将告诉您碰撞在四个八分之一中(通过上述切线​​范围)。要计算出确切的八分圆,只需比较x1和x2以确定哪个是最左边的。

另一个碰撞上的碰撞的八分圆是偏移的(C1上的八分圆1表示C2、2和6、3和7、4和8等上的八分圆)。

2020-07-28