圆圈之间的碰撞很容易。想象有两个圆圈:
- C1,中心为 (x1,y1),半径为 r1;
- C2 具有中心 (x2,y2) 和半径 r2。
想象在这两个中心点之间有一条线。根据定义,从中心点到任一圆的边缘的距离等于它们各自的半径。所以:
- 如果圆的边缘相接触,则圆心之间的距离为 r1+r2;
- 任何更大的距离,圆圈不会接触或碰撞;和
- 少一点,然后碰撞。
因此,如果出现以下情况,您可以检测到碰撞:
(x2-x1)^2 + (y2-y1)^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 >= 棕褐色 X >= -1 对于 0 >= X => -45;
- tan X <= -1 表示 -45 >= X => -90;和
- 棕褐色 X = 棕褐色 (X+180) = 棕褐色 (X-180)。
这四个度数范围对应于圆的四个八分圆。其他四个偏移 180 度。如上所示,正切可以简单地计算为:
|y2 - y1|
tan X = -------
|x2 - x1|
失去绝对值,这个比率会告诉你碰撞在四个八分圆中的哪一个(通过上述切线范围)。要计算出确切的八分圆,只需比较 x1 和 x2 以确定哪个是最左边的。
另一个单的碰撞八分圆是偏移的(C1 上的八分圆 1 表示 C2 上的八分圆 5、2 和 6、3 和 7、4 和 8 等)。