fork download
  1. # -*- coding: utf-8 -*-
  2. # ball_collide.py
  3. # MIT OCW 6.189 Homework 3
  4. # Exercise 3.2 – Collision Detection of Balls
  5. # Mechanical MOOC
  6. # Judy Young
  7. # July 23, 2013
  8. # To figure out if two balls are colliding, we need to compute the distance
  9. # between their centers, then see if this distance is less than or equal to
  10. # the sum of their radii. If so, they are colliding.
  11.  
  12. import math
  13.  
  14. def ball_collide(ball_1, ball_2):
  15.  
  16. sumRadii = float(ball_1[3] + ball_2[3])
  17. xDiffSquared = (float(ball_1[0]) - float(ball_2[0]))**2
  18. yDiffSquared = (float(ball_1[1]) - float(ball_2[1]))**2
  19. zDiffSquared = (float(ball_1[2]) - float(ball_2[2]))**2
  20. centreDistance = math.sqrt( xDiffSquared + yDiffSquared + zDiffSquared )
  21.  
  22. print "\nball_1", ball_1
  23. print "ball_2", ball_2
  24. print "sumRadii = ", sumRadii
  25. print "xDiffSquared = ", xDiffSquared
  26. print "yDiffSquared = ", yDiffSquared
  27. print "zDiffSquared = ", zDiffSquared
  28. print "centreDistance = ", centreDistance
  29.  
  30. if centreDistance > sumRadii:
  31. return "All Clear\n"
  32. else:
  33. return "CRASH!\n"
  34.  
  35. print "Balls small, far apart", ball_collide((0,0,0,1), (7,7,7,1))
  36. print "Both balls the same size, in the same place", ball_collide((0,0,0,1), (0,0,0,1))
  37. print "Both balls in the same place, different sizes", ball_collide((0,0,0,1), (0,0,0,7))
  38. print "Balls just touching", ball_collide((0,0,0,1), (0,2,0,1))
  39. print "Balls small, far apart, each side of 0,0,0", ball_collide((-5,-5,-5,1), (0,2,0,1))
Success #stdin #stdout 0.01s 7728KB
stdin
Standard input is empty
stdout
Balls small, far apart 
ball_1 (0, 0, 0, 1)
ball_2 (7, 7, 7, 1)
sumRadii =  2.0
xDiffSquared =  49.0
yDiffSquared =  49.0
zDiffSquared =  49.0
centreDistance =  12.124355653
All Clear

Both balls the same size, in the same place 
ball_1 (0, 0, 0, 1)
ball_2 (0, 0, 0, 1)
sumRadii =  2.0
xDiffSquared =  0.0
yDiffSquared =  0.0
zDiffSquared =  0.0
centreDistance =  0.0
CRASH!

Both balls in the same place, different sizes 
ball_1 (0, 0, 0, 1)
ball_2 (0, 0, 0, 7)
sumRadii =  8.0
xDiffSquared =  0.0
yDiffSquared =  0.0
zDiffSquared =  0.0
centreDistance =  0.0
CRASH!

Balls just touching 
ball_1 (0, 0, 0, 1)
ball_2 (0, 2, 0, 1)
sumRadii =  2.0
xDiffSquared =  0.0
yDiffSquared =  4.0
zDiffSquared =  0.0
centreDistance =  2.0
CRASH!

Balls small, far apart, each side of 0,0,0 
ball_1 (-5, -5, -5, 1)
ball_2 (0, 2, 0, 1)
sumRadii =  2.0
xDiffSquared =  25.0
yDiffSquared =  49.0
zDiffSquared =  25.0
centreDistance =  9.94987437107
All Clear