一些物理见解
1)对于目标是“点对象”
因此,您需要解决矢量方程:
Positionbullet [ time=t1 > t0 ] == Positiontarget [ time=t1 > t0 ] -- (Eq 1)
其中位置由运动(也是矢量)方程给出:
Positionobject [ t ] = Positionobject [ t0 ] + Speedobject * ( t - t0 )
现在,子弹能够到达目标的条件是方程式1有x和y的解。让我们写出x的方程式:
Xbullet [ t0 ] + SpeedXbullet * ( t - t0 ) = Xtarget [ t0 ] + SpeedXtarget * ( t - t0 )
因此,对于碰撞时间,我们有:
( tCollision - t0 ) = (xtarget [ t 0 ] - xbullet [ t0 ] ) / (SpeedXbullet - SpeedXtarget) -- (Eq 2)
由于我们需要t>t0的解,这意味着对于有拦截的情况而言:
Sign ( xtarget[ t0 ] - xbullet[ t0 ] ) = Sign ( SpeedXbullet - SpeedXtarget ) -- (Eq 3)
这告诉我们一个明显的事实,如果一个物体比另一个物体移动得更快,并且在同一方向上,它们最终会碰撞。
从方程式2中,您可以看到对于给定的SpeedXtarget,存在无限个t和SpeedXbullet的解(如其他答案所指出的),因此我认为您的规格说明不完整。
我猜(正如我在另一个答案中所述的评论)您正在考虑一种“塔防”类型的游戏,其中您的子弹有限的射程。
因此,您还需要另一个限制条件:
距离 [Positiontarget[tCollision - t0] - Positionbullet[t0]] < BulletRange -- (Eq 4)
这仍然允许无限的解,但由于目标可能超出范围,上限值由碰撞时间确定。
此外,距离由以下公式给出:
距离[v,u]= +Sqrt[(Vx-Ux)^2 + (Vx-Vy)^2]
因此,方程4变为:
(Xtarget[tCollision - t0] - Xbullet[t0])2 + (Ytarget[tCollision - t0] - Ybullet[t0])2 < BulletRange2 -- (Eq 5)
请注意,{X
bullet[t
0], Y
bullet[t
0]}是塔的位置。
现在,在方程5中替换目标位置的值:
(Xtarget[t0] + SpeedXtarget * (t-t0) - Xbullet[t0])2 + (Ytarget[t0] + SpeedYtarget * (t-t0) - Ybullet[t0])2 < BulletRange2 -- (Eq 6)
称初始距离为:
Dxt0 = X
target[t
0] - X
bullet[t
0]
和
Dyt0 = Y
target[t
0] - Y
bullet[t
0]
方程6变为:
(Dtx0 + SpeedXtarget * (t-t0) )2 + (Dty0 + SpeedYtarget * (t-t0))2 < BulletRange2 -- (Eq 7)
这是一个要在 t-t0 中解决的二次方程。正解将给出我们允许的最大碰撞时间。之后目标将超出范围。
现在调用
Speedtarget 2 = SpeedXtarget 2 + SpeedYtarget 2
和
H = Dtx0 * SpeedXtarget + Dty0 * SpeedYtarget
TCollision Max = t0 - ( H
+/- Sqrt ( BulletRange2 * Speedtarget 2 - H2 ) ) / Speedtarget 2
因此,您需要在此时间之前产生碰撞。平方根的符号应该被取为时间大于 t0。
After you select an appropriate flying time for your bullet from the visual
effects point of view, you can calculate the SpeedX and SpeedY for the bullet
from
SpeedXbullet = ( Xtarget [ t0 ] - Xbullet [ t0 ] ) / ( tCollision - t0 ) + SpeedXtarget
SpeedYbullet = ( Ytarget [ t0 ] - Ybullet [ t0 ] ) / ( tCollision - t0 ) + SpeedYtarget
2) 对于目标和塔的 "广阔物体"
现在,将目标替换为半径为R的圆形,问题就变得简单了。您所得到的是子弹的“扩展射程”。这个扩展范围就是R。
所以,将BulletRange替换为(BulletRange + R),您会得到新的最大允许碰撞时间方程式。
如果您还想考虑炮塔的半径,同样的考虑也适用,可以得到一个“双倍扩展范围”:
NewBulletRange = BulletRange + RTarget + RTower
无尽子弹射程
如果您决定某些特殊子弹不应有射程(和探测)限制,仍然会受到屏幕边界的约束。但这需要更复杂的计算,请在评论中提出需求,我会尝试解答。