fork(1) download
  1. from math import sqrt, isclose
  2.  
  3. def collisiontime(x1,y1,z1,vx1,vy1,vz1,r1, x2,y2,z2,vx2,vy2,vz2,r2):
  4. x2 -= x1
  5. y2 -= y1
  6. z2 -= z1
  7. vx2 -= vx1
  8. vy2 -= vy1
  9. vz2 -= vz1
  10. a = vx2**2 + vy2**2 + vz2**2
  11. b = 2*x2*vx2 + 2*y2*vy2 + 2*z2*vz2
  12. c = x2**2 + y2**2 + z2**2 - (r1+r2)**2
  13. D = b**2-4*a*c
  14. if D < 0:
  15. return None
  16. if isclose(D, 0):
  17. return -b/2/a
  18. return (-b - sqrt(D)) / 2 /a, (-b + sqrt(D)) / 2 /a
  19.  
  20. print(collisiontime(0, 0, 0, 2, 0, 0, 2, 25, 0, 0, -3, 0, 0, 3)) # 1=> <=2
  21. print(collisiontime(0, 0, 0, 2, 0, 0, 2, 25, 5, 0, 1, 0, 0, 3)) # 1=> <=2 chase wuth touching
  22.  
  23. print(collisiontime(-7, 5, 0,-1, 0, 3, 3, 10, 7, -6, -2, 0, 4, 6))
  24. print(collisiontime(10, 3, -10,-9, 3, -8,5, 2, 0, 0, -4, 3, -10, 6))
Success #stdin #stdout 0.02s 9172KB
stdin
Standard input is empty
stdout
(4.0, 6.0)
25.0
(8.627718676730986, 14.372281323269014)
(0.4917797757201004, 3.646151258762658)