5

假设我们有带有位置矢量和速度大小的导弹 A(忽略加速度,就像许多游戏一样)和带有位置和速度矢量的宇宙飞船 B。现在,这枚导弹,作为一种令人讨厌的寻找导弹,将尝试为宇宙飞船 B 找到最佳拦截。

导弹A有两个优点:它知道微积分,它可以计算多项式的根。然而,导弹,或者抽象地说,程序员,还在学习微积分,想知道他是否有正确的方程。(多项式根将由一个名为 Jenkins-Traub Code Implemented From Netlib 的好人来解决)

以机智:

  • 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,该功能的变化率可能是我正在寻找的。

所以 - 我做错了什么,在哪里以及为什么?

谢谢。

指向第一个线程的潜在有用链接。

编辑:

对方程求和:

(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

我认为绝对不是那样。

4

3 回答 3

2

导弹的二维运动方程为(假设从 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)或者是给定目标拦截时间的速度分量。

从问题中不清楚你在寻找什么。

于 2011-09-16T12:09:52.563 回答
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以获得更新的目标位置。迭代。

于 2011-09-16T15:39:34.573 回答
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)

我没有时间进一步简化,但它可以完成,或者只是评估它。

然后将 t 重新插入:

svx=(mpx-spx)/t+mvx
svy=(mpy-spy)/t+mvy

得到 s 向量。

也许我在某个地方做错了......

于 2011-09-16T15:59:15.713 回答