假设我们有导弹A,具有位置矢量和速度大小(忽略加速度,就像许多游戏一样)和太空飞船B,具有位置和速度矢量。现在,这种导弹是一个讨厌的寻找导弹,将试图找到最佳的太空船B拦截。
导弹A有两个优点:它知道微积分,它可以计算多项式的根。然而,导弹,或抽象的,程序员,仍在学习微积分,并想知道他是否有正确的方程式。 (多项式根源将由一个名为Jenkins-Traub Code的Netclib实现的好人解决)
即便:
mp =导弹位置
mv =导弹速度
sp =宇宙飞船位置
sv =宇宙飞船速度
t =时间
根据程序员的最佳猜测,拦截方程为: t sp sv + t sp mv - t mp sv - t mp mv
除非我非常确定我完全走错了轨道,因为在这个混乱中应该有一些指数;这是尝试解决: (SP-MP)(SV-MV)(t)的
我的另一个选择是区分(sp-mp)(sv-mv)^ 2,但我想先得到反馈,部分是因为,除非我弄错了,'(sp-mp)'解析为'1' 。这似乎......奇怪。 OTOH,这个功能正在改变的速度可能正是我正在寻找的。 p>
那么 - 我有什么问题,在哪里以及为什么?
感谢。
Potentially-useful link to first thread.
编辑:
总结方程:
(a + bx)+(c + ex)
(a + 1bx ^ 0)+(c + 1ex ^ 0)
(a + 1)+(c + 1)
非存活的。
方程式的乘积:
(A + BX)(C + EX)
AC + AEX + CBX + BEX ^ 2
不是多项式(无法用Jenkins-Traub解决)并且看起来不太正确。
AC + 1aex ^ 0 + ^ 1cbx 0 + 2bex ^ 1
AC + AE + CB + 2bex
我认为绝对不是那样。
答案 0 :(得分:2)
导弹的2D运动方程是(假设从t = 0开始)
[ mpx(t) = mpx(0) + mvx*t , mpy(t) = mpy(0) + mvy*t ]
宇宙飞船的动作是
[ spx(t) = spx(0) + svx*t , spy(t) = spy(0) + svy*t ]
其中mpx(0)
mpy(0)
spx(0)
spy(0)
是初始位置组件
因此要相交,您必须拥有mpx(t)=spx(t)
和mpy(t)=spy(t)
。哪两个方程可以解决两个未知数。一个可能是拦截t
的时间,另一个是slope=mvy/mvx
给出的导弹的方向。或者它可能是导弹mpx(0)
和mpy(0)
的初始位置,或者是给定目标拦截时间的速度分量。
从问题中不清楚你在寻找什么。
答案 1 :(得分:0)
Position_Ship + t*Velocity_Ship = Position_Missile + t*Velocity_Missile
如果将它们设置为拦截,则可以在任意维度上轻松解决t
。
如果你想确定Velocity_Missile
,我们还需要一个约束。
N = (Position_Missile - Position_Ship) ^ Velocity_Ship
(跨产品)
N dot Velocity_Missle = 0
这将为您提供一对或线性联立方程。
如果最初给出Velocity_Missile
并且我们想要应用加速直到我们进入限制半径,那么它就变得棘手了。您可以使用简单的追踪曲线获得美观的解决方案,或者我们可以获得数值......
让Velocity_Missile'
成为上面的瞬时解,导出相应的t'
,给定电机的功效,您可以计算出t''
时间来传递速度变化。添加此t''*Ship_Velocity
以获取更新的目标位置。迭代。
答案 2 :(得分:0)
如果你有mp,mv和sp,那么计算sv和t:
mp+mv(t)=sp+sv(t) and |sv|=q (maxspeed)
mp+mv(t)-sp+sv(t)=0
mpx+mvx*t-spx+svx*t=0
mpy+mvy*t-spy+svy*t=0
svx^2+svy^2=q^2
svx^2+svy^2-q^2=0
然后我们可以解决:
(mpx-spx)/t+mvx=svx
(mpy-spy)/t+mvy=svy
((mpx-spx)/t+mvx)^2+((mpy-spy)/t+mvy)^2=q^2
(mpx-spx)^2/t^2+2*mvx*(mpx-spx)/t+mvx^2+(mpy-spy)^2/t^2+2*mvy*(mpy-spy)/t+mvy^2=q^2
((mpx-spx)^2+(mpy-spy)^2)/t^2+(2*mvx*(mpx-spx)+2*mvy*(mpy-spy))/t+mvx^2+mvy^2-q^2=0
((mpx-spx)^2+(mpy-spy)^2)+(2*mvx*(mpx-spx)+2*mvy*(mpy-spy))*t+(mvx^2+mvy^2-q^2)*t^2=0
((mpx-spx)^2+(mpy-spy)^2)/(mvx^2+mvy^2-q^2)+(2*mvx*(mpx-spx)+2*mvy*(mpy-spy))/(mvx^2+mvy^2-q^2)*t+t^2=0
c = (mvx^2+mvy^2-q^2)
if a = (2*mvx*(mpx-spx)+2*mvy*(mpy-spy))/c
and b = ((mpx-spx)^2+(mpy-spy)^2)/c
then t = -a/2+-sqrt(a^2/4-b)
a/2 = (2*mvx*(mpx-spx)+2*mvy*(mpy-spy))/2c
a/2 = (mvx*(mpx-spx)+mvy*(mpy-spy))/c
a^2/4 = (mvx^2*(mpx-spx)^2+2*mvx*(mpx-spx)*mvy*(mpy-spy)+mvy^2*(mpy-spy)^2)/c^2
b/c^2=((mpx-spx)^2+(mpy-spy)^2)*c
b/c^2=((mpx-spx)^2+(mpy-spy)^2)*(mvx^2+mvy^2-q^2)
b/c^2=mvx^2(mpx-spx)^2+mvx^2(mpy-spy)^2+mvy^2(mpx-spx)^2+mvy^2(mpy-spy)^2-q^2(mpx-spx)^2-q^2(mpy-spy)^2
t = -(mvx*(mpx-spx)+mvy*(mpy-spy))/c +- sqrt((mvx^2*(mpx-spx)^2+2*mvx*(mpx-spx)*mvy*(mpy-spy)+mvy^2*(mpy-spy)^2)-(mvx^2(mpx-spx)^2+mvx^2(mpy-spy)^2+mvy^2(mpx-spx)^2+mvy^2(mpy-spy)^2-q^2(mpx-spx)^2-q^2(mpy-spy)^2))/c
t = -(mvx*(mpx-spx)+mvy*(mpy-spy))/c +- sqrt((2*mvx*(mpx-spx)*mvy*(mpy-spy))-(mvx^2(mpy-spy)^2+mvy^2(mpx-spx)^2)+q^2((mpx-spx)^2+(mpy-spy)^2)))/c
t = -(mvx*(mpx-spx)+mvy*(mpy-spy))/c +- sqrt(-(mvx(mpy-spy)-mvy(mpx-spx))^2+q^2((mpx-spx)^2+(mpy-spy)^2)))/c
t = -(mvx*(mpx-spx)+mvy*(mpy-spy))/c +- sqrt(-(mvx(mpy-spy)-mvy(mpx-spx))^2+q^2(c+q^2))/c
t = -(mvx*(mpx-spx)+mvy*(mpy-spy))/c +- sqrt(-(mvx(mpy-spy)-mvy(mpx-spx))^2+q^2(c+q^2))/c
t = -(mvx*(mpx-spx)+mvy*(mpy-spy))/c +- sqrt(-(mvx(mpy-spy)-mvy(mpx-spx))^2+q^2(c+q^2))/(mvx^2+mvy^2-q^2)
我没有时间进一步简化,但可以完成,或只是评估它。
然后插回:
svx=(mpx-spx)/t+mvx
svy=(mpy-spy)/t+mvy
获取s矢量。
也许我在某处犯了错误......