# -*- coding: utf-8 -*-
# ball_collide.py
# MIT OCW 6.189 Homework 3
# Exercise 3.2 – Collision Detection of Balls
# Mechanical MOOC
# Judy Young
# July 23, 2013
# To figure out if two balls are colliding, we need to compute the distance
# between their centers, then see if this distance is less than or equal to
# the sum of their radii. If so, they are colliding.
import math
def ball_collide(ball_1, ball_2):
sumRadii = float(ball_1[3] + ball_2[3])
xDiffSquared = (float(ball_1[0]) - float(ball_2[0]))**2
yDiffSquared = (float(ball_1[1]) - float(ball_2[1]))**2
zDiffSquared = (float(ball_1[2]) - float(ball_2[2]))**2
centreDistance = math.sqrt( xDiffSquared + yDiffSquared + zDiffSquared )
print "\nball_1", ball_1
print "ball_2", ball_2
print "sumRadii = ", sumRadii
print "xDiffSquared = ", xDiffSquared
print "yDiffSquared = ", yDiffSquared
print "zDiffSquared = ", zDiffSquared
print "centreDistance = ", centreDistance
if centreDistance > sumRadii:
return "All Clear\n"
else:
return "CRASH!\n"
print "Balls small, far apart", ball_collide((0,0,0,1), (7,7,7,1))
print "Both balls the same size, in the same place", ball_collide((0,0,0,1), (0,0,0,1))
print "Both balls in the same place, different sizes", ball_collide((0,0,0,1), (0,0,0,7))
print "Balls just touching", ball_collide((0,0,0,1), (0,2,0,1))
print "Balls small, far apart, each side of 0,0,0", ball_collide((-5,-5,-5,1), (0,2,0,1))
IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIyBiYWxsX2NvbGxpZGUucHkKIyBNSVQgT0NXIDYuMTg5IEhvbWV3b3JrIDMKIyBFeGVyY2lzZSAzLjIg4oCTIENvbGxpc2lvbiBEZXRlY3Rpb24gb2YgQmFsbHMKIyBNZWNoYW5pY2FsIE1PT0MKIyBKdWR5IFlvdW5nCiMgSnVseSAyMywgMjAxMwojIFRvIO+sgWd1cmUgb3V0IGlmIHR3byBiYWxscyBhcmUgY29sbGlkaW5nLCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIAojIGJldHdlZW4gdGhlaXIgY2VudGVycywgdGhlbiBzZWUgaWYgdGhpcyBkaXN0YW5jZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gCiMgdGhlIHN1bSBvZiB0aGVpciByYWRpaS4gSWYgc28sIHRoZXkgYXJlIGNvbGxpZGluZy4KCmltcG9ydCBtYXRoCgpkZWYgYmFsbF9jb2xsaWRlKGJhbGxfMSwgYmFsbF8yKToKICAgIAogICAgc3VtUmFkaWkgPSBmbG9hdChiYWxsXzFbM10gKyBiYWxsXzJbM10pCiAgICB4RGlmZlNxdWFyZWQgPSAoZmxvYXQoYmFsbF8xWzBdKSAtIGZsb2F0KGJhbGxfMlswXSkpKioyCiAgICB5RGlmZlNxdWFyZWQgPSAoZmxvYXQoYmFsbF8xWzFdKSAtIGZsb2F0KGJhbGxfMlsxXSkpKioyCiAgICB6RGlmZlNxdWFyZWQgPSAoZmxvYXQoYmFsbF8xWzJdKSAtIGZsb2F0KGJhbGxfMlsyXSkpKioyCiAgICBjZW50cmVEaXN0YW5jZSA9IG1hdGguc3FydCggeERpZmZTcXVhcmVkICsgeURpZmZTcXVhcmVkICsgekRpZmZTcXVhcmVkICkKCiAgICBwcmludCAiXG5iYWxsXzEiLCBiYWxsXzEKICAgIHByaW50ICJiYWxsXzIiLCBiYWxsXzIKICAgIHByaW50ICJzdW1SYWRpaSA9ICIsIHN1bVJhZGlpCiAgICBwcmludCAieERpZmZTcXVhcmVkID0gIiwgeERpZmZTcXVhcmVkCiAgICBwcmludCAieURpZmZTcXVhcmVkID0gIiwgeURpZmZTcXVhcmVkCiAgICBwcmludCAiekRpZmZTcXVhcmVkID0gIiwgekRpZmZTcXVhcmVkCiAgICBwcmludCAiY2VudHJlRGlzdGFuY2UgPSAiLCBjZW50cmVEaXN0YW5jZQoKICAgIGlmIGNlbnRyZURpc3RhbmNlID4gc3VtUmFkaWk6CiAgICAgICAgcmV0dXJuICJBbGwgQ2xlYXJcbiIKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICJDUkFTSCFcbiIKICAgIApwcmludCAiQmFsbHMgc21hbGwsIGZhciBhcGFydCIsIGJhbGxfY29sbGlkZSgoMCwwLDAsMSksICg3LDcsNywxKSkKcHJpbnQgIkJvdGggYmFsbHMgdGhlIHNhbWUgc2l6ZSwgaW4gdGhlIHNhbWUgcGxhY2UiLCBiYWxsX2NvbGxpZGUoKDAsMCwwLDEpLCAoMCwwLDAsMSkpCnByaW50ICJCb3RoIGJhbGxzIGluIHRoZSBzYW1lIHBsYWNlLCBkaWZmZXJlbnQgc2l6ZXMiLCBiYWxsX2NvbGxpZGUoKDAsMCwwLDEpLCAoMCwwLDAsNykpCnByaW50ICJCYWxscyBqdXN0IHRvdWNoaW5nIiwgYmFsbF9jb2xsaWRlKCgwLDAsMCwxKSwgKDAsMiwwLDEpKQpwcmludCAiQmFsbHMgc21hbGwsIGZhciBhcGFydCwgZWFjaCBzaWRlIG9mIDAsMCwwIiwgYmFsbF9jb2xsaWRlKCgtNSwtNSwtNSwxKSwgKDAsMiwwLDEpKQ==
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