Punkt zderzenia dwóch obiektów o znanej prędkości poruszania na osi współrzędnyc
Marcin: Znajdź punkt zderzenia obiektu B z obiektem A na osi współrzędnych:
http://i.imgur.com/ltanTm3.png
Obiekt A aktualnie znajduje się w położeniu A1. Znane jest następne położenie obiektu w punkcie
A2 w czasie TA.
Prędkość VA = 2, długość SA|AA1|=pierw.((10−7)kw.+(12−8)kw.) = 5. A więc TA = VA * SA = 5 * 2 =
10
Obiekt B znajduje się w położeniu B1, musi zostać wystrzelony z punktu B1 po linii prostej tak
by spotkał się z obiektem A. Jak obliczyć ten punkt zderzenia znając VB = 8 ?
Ułatwienie dla zadania −> można to obliczyć za pomocą funkcji kwadratowej.
15 mar 20:09
Marcin: mała poprawka
TA = SA / VA = 5 / 2 = 2.5
15 mar 20:14
Marcin: To jest rozwiązanie problemu ale nie wiem jak to przełożyć na zrozumiały język
O co chodzi z
tym target velocity ? Jak dałem targetvelocity X i Y tam gdzie jest B2 to punkt kolizji zawsze
jest blisko B2 nawet gdy jest on dalej czy bliżej więc to velocity chyba trzeba najpierw jakoś
obliczyć, podobno jest to wektor prędkości który ma kierunek itd.
; Normalize the Target Direction + multiply the Target
Velocity
Local In# =
Target
Velocity/Sqr(TargetDir
x*TargetDir
x+TargetDir
y*TargetDir
y+TargetDir
z*TargetDir
z)
Local Ix# = TargetDir
x*In, Iy# = TargetDir
y*In, Iz# = TargetDir
z*In
; square target velocity substract square bullet velocity
Local a# = Ix*Ix+Iy*Iy+Iz*Iz − Bullet
Velocity*Bullet
Velocity
; distance Bullet−> target
Local Dx# = Targetx−Bulletx
Local Dy# = Targety−Bullety
Local Dz# = Targetz−Bulletz
; a not really complicated equation : no big deal (2.0* dot product of Distance and Target
Velocity)
Local b# = + Float(2.0)*( Dx*Ix + Dy*Iy + Dz*Iz )
; the Square distance
Local c# = (Dx*Dx+Dy*Dy+Dz*Dz)
; then the famous Discriminant, which is really simple
Local Det# = b*b−4.0*a*c
Local time#=0.0
; And deal with 2 solutions
If Det<0 Then Return −1 ; no solution
If Det>0
Det=Sqr(Det)
time = −0.5*(b−Det)/a
If time<0 Then time=−0.5*(b+Det)/a
Else
time = −0.5*b/a
EndIf
; And Here we are.
ResultX = Dx + time * Ix
ResultY = Dy + time * Iy
ResultZ = Dz + time * Iz
; Eventually, normalize the result
Local n# = 1.0/Sqr(Resultx*Resultx+Resulty*Resulty+Resultz*Resultz)
Resultx = Resultx * n
Resulty = Resulty * n
Resultz = Resultz * n
16 mar 08:14
16 mar 09:11
16 mar 09:18