Cho hai quả cầu bán kính r1, r2, vị trí pos1, pos2 và gia tốc acc1, trong không gian 3D. Kiểm tra xem chúng có bao giờ va chạm nhau hay không.
Ví dụ: → (cầu 2 đứng yên, cầu 1 di chuyển theo x).
Thuật toán giải quyết (Giải tích vector)
- Tính vector vị trí tương đối:
p = pos1 - pos2 - Tính vector gia tốc tương đối:
a = acc1 - acc2 - Khoảng cách bình phương giữa hai tâm tại thời điểm
t:|p + 0.5*a*t²|² - Tìm
t ≥ 0cực tiểu hóa khoảng cách:t = max(0, - (a·p) / |a|²) - Tính khoảng cách nhỏ nhất
distạitđó - Nếu
: trả về, ngược lại
Ví dụ minh họa
def solve(r1, r2, pos1, acc1, pos2, acc2):
px, py, pz = pos1[0]-pos2[0], pos1[1]-pos2[1], pos1[2]-pos2[2]
ax, ay, az = acc1[0]-acc2[0], acc1[1]-acc2[1], acc1[2]-acc2[2]
da = ax*ax + ay*ay + az*az
dp = px*px + py*py + pz*pz
co = ax*px + ay*py + az*pz
x = 0.0
if da != 0:
x = -co / da
x = max(x, 0)
dis = (da * x * x + 2 * co * x + dp) ** 0.5
if dis <= r1 + r2:
return True
else:
return False
r1 = 1
r2 = 2
pos1 = (0, 0, 0)
acc1 = (100, 0, 0)
pos2 = (4, 0, 0)
acc2 = (0, 0, 0)
print(solve(r1, r2, pos1, acc1, pos2, acc2))
Đầu vào
1, 2, (0, 0, 0), (100,0,0), (4, 0, 0), (0,0,0)
Đầu ra
False