這是問題所在。我們在 xyz 中有兩個點(球體),包含以下資訊:
1- x,y,z => 物件的中心當前位于
2- r => 物體的碰撞半徑
3- Vx, Vy, Vz => 物體沿向量行進。如果該向量是 (0,0,0),則物件是靜止的。
注意:半徑和位置以米為單位,速度以米/秒為單位。
問題:對于每個測驗,輸出一行,其中包含自測驗開始以來兩個物件第一次碰撞的時間(以秒為單位)。如果它們從不發生碰撞,則列印無碰撞。
我想知道這次的計算公式。任何想法將不勝感激。
例子:
1-
xyz(1): -7 5 0
v(1): -1 0 3
r(1): 3
xyz(2): 10 7 -6
v(2): -2 0 4
r(2): 6
t: 8.628 // this is the answer
2-
xyz(1): 10 3 -10
v(1): -9 3 -8
r(1): 5
xyz(2): 2 0 0
v(2): 6
r(2): -4 3 -10
t: 0.492 // this is the answer
uj5u.com熱心網友回復:
為了簡化問題,讓我們使用Halileo 原理。將第一個物件視為基點,因此第二個物件相對于它移動。
將第一個物件位置放在坐標原點。
從第二個坐標中減去第一個物件的初始坐標,對速度分量執行相同的操作
x2_0 = x2_0 - x1_0 (same for y,z)
Vx2 = Vx2 - Vx1 (same for y,z)
現在我們有了第二個時間中心坐標
x = x2_0 Vx2 * t
y = y2_0 Vy2 * t
z = z2_0 Vz2 * t
和到原點的平方距離:
dd = x*x y*y z*z =
(x2_0 Vx2 * t)^2 ... =
x2_0^2 2*x2_0*Vx2*t Vx2^2*t^2 ...
我們需要計算何時dd變得等于平方半徑總和(r1 r2)^2
t^2 * (Vx2^2 Vy2^2 Vz2^2) t*(2*x2_0*Vx2 2*y2_0*Vy2 2*z2_0*Vz2)
x2_0^2 y2_0^2 y2_0^2 - (r1 r2)^2 = 0
求解 的二次方程t,得到 0,1 或 2 個解。
0 個解決方案的情況 - 無碰撞
1 個解決方案的情況,具有正值t- 接觸時刻
兩個解決方案的情況 -t在碰撞時刻獲得更小的正值。
t測驗開始前“過去”平均碰撞的負值
在 Python 中進行快速測驗 ( ideone )
from math import sqrt, isclose
def collisiontime(x1,y1,z1,vx1,vy1,vz1,r1, x2,y2,z2,vx2,vy2,vz2,r2):
x2 -= x1
y2 -= y1
z2 -= z1
vx2 -= vx1
vy2 -= vy1
vz2 -= vz1
a = vx2**2 vy2**2 vz2**2
b = 2*x2*vx2 2*y2*vy2 2*z2*vz2
c = x2**2 y2**2 z2**2 - (r1 r2)**2
D = b**2-4*a*c
if D < 0:
return None
if isclose(D, 0):
return -b/2/a
return (-b - sqrt(D)) / 2 /a, (-b sqrt(D)) / 2 /a
print(collisiontime(0, 0, 0, 2, 0, 0, 2, 25, 0, 0, -3, 0, 0, 3)) # 1=> <=2
print(collisiontime(0, 0, 0, 2, 0, 0, 2, 25, 5, 0, 1, 0, 0, 3)) # 1==> 2=> chase with touching
print(collisiontime(-7, 5, 0,-1, 0, 3, 3, 10, 7, -6, -2, 0, 4, 6))
print(collisiontime(10, 3, -10,-9, 3, -8,5, 2, 0, 0, -4, 3, -10, 6))
(4.0, 6.0)
25.0
(8.627718676730986, 14.372281323269014)
(0.4917797757201004, 3.646151258762658)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/374283.html
