Tuesday, March 30, 2010

Strizich_VPython_Collisions



from visual import *
from visual.controls import *
from visual.graph import *

ballOne = sphere(pos=(1,0,0), radius=0.4, color=color.red)
ballTwo = sphere(pos=(-1,-2,0), radius=0.4, color=color.blue)
wallR = box(pos=(6,0,0), size=(0.2,12,12), color=color.green)
wallL = box(pos=(-6,0,0), size=(0.2,12,12), color=color.green)
wallTop = box(pos=(0,6,0), size=(12,0.2,12), color=color.green)
wallBot = box(pos=(0,-6,0), size=(12,0.2,12), color=color.green)
#wallBack = box(pos=(0,0,-6), size=(12,12,0.2), color=color.green)


ballOne.velocity=vector(-5,-5,0)
ballTwo.velocity=vector(0,0,0)
mOne=1
mTwo=1
deltat = 0.005
coeffRest=1
t = 0

c = controls(x=429, y=0)
slideC=slider( pos=(14,14), width=7, length=70, min=0.0, max=1.0, axis=(0,1,0))#, action=lambda: change(slideC.value) )


#def change(x):
# coeffRest=x

slideC.value=coeffRest

graph1 = gdisplay(x=429, y=300, width=600, height=350,
title='Red "Y" Velocity vs. Time', xtitle='time (s)', ytitle='v (m/s)',
xmax=20, xmin=0., ymax=20, ymin=-20,
foreground=color.black, background=color.white)
ballRY = gcurve(gdisplay = graph1, color = color.black)

graph2 = gdisplay(x=429, y=650, width=600, height=350,
title='Red "X" Velocity vs. Time', xtitle='time (s)', ytitle='v (m/s)',
xmax=20, xmin=0., ymax=20, ymin=-20,
foreground=color.black, background=color.white)
ballRX = gcurve(gdisplay = graph2, color = color.black)

graph3 = gdisplay(x=1029, y=300, width=600, height=350,
title='Blue "Y" Velocity vs. Time', xtitle='time (s)', ytitle='v (m/s)',
xmax=20, xmin=0., ymax=20, ymin=-20,
foreground=color.black, background=color.white)
ballBY = gcurve(gdisplay = graph3, color = color.black)

graph4 = gdisplay(x=1029, y=650, width=600, height=350,
title='Blue "X" Velocity vs. Time', xtitle='time (s)', ytitle='v (m/s)',
xmax=20, xmin=0., ymax=20, ymin=-20,
foreground=color.black, background=color.white)
ballBX = gcurve(gdisplay = graph4, color = color.black)

while t<20:
rate(100)
c.interact()
coeffRest = slideC.value

#Ball One

if ballOne.pos.x > wallR.pos.x-0.5:
ballOne.velocity.x = -ballOne.velocity.x*coeffRest
if ballOne.pos.x < wallL.pos.x+0.5:
ballOne.velocity.x = -ballOne.velocity.x*coeffRest
if ballOne.pos.y > wallTop.pos.y-0.5:
ballOne.velocity.y = -ballOne.velocity.y*coeffRest
if ballOne.pos.y < wallBot.pos.y+0.5:
ballOne.velocity.y = -ballOne.velocity.y*coeffRest
ballOne.pos=ballOne.pos + ballOne.velocity*deltat

#Ball Two

if ballTwo.pos.x > wallR.pos.x-0.5:
ballTwo.velocity.x = -ballTwo.velocity.x*coeffRest
if ballTwo.pos.x < wallL.pos.x+0.5:
ballTwo.velocity.x = -ballTwo.velocity.x*coeffRest
if ballTwo.pos.y > wallTop.pos.y-0.5:
ballTwo.velocity.y = -ballTwo.velocity.y*coeffRest
if ballTwo.pos.y < wallBot.pos.y+0.5:
ballTwo.velocity.y = -ballTwo.velocity.y*coeffRest
ballTwo.pos=ballTwo.pos + ballTwo.velocity*deltat

#Ball to Ball Collisions

if ((((ballTwo.pos.x-ballOne.pos.x)*(ballTwo.pos.x-ballOne.pos.x))+ ((ballTwo.pos.y-ballOne.pos.y)*(ballTwo.pos.y-ballOne.pos.y))) < ((ballOne.radius+ballTwo.radius)*(ballOne.radius+ballTwo.radius))):
lamdaV = atan2((ballOne.velocity.y - ballTwo.velocity.y),(ballOne.velocity.x - ballTwo.velocity.x))

lamdaXY= atan2((ballTwo.pos.y-ballOne.pos.y),(ballTwo.pos.x-ballOne.pos.x))

distance= sqrt(((ballTwo.pos.x-ballOne.pos.x)*(ballTwo.pos.x-ballOne.pos.x))+ ((ballTwo.pos.y-ballOne.pos.y)*(ballTwo.pos.y-ballOne.pos.y)))

alpha=asin(distance*sin(lamdaXY-lamdaV)/(ballOne.radius+ballTwo.radius))

a=tan(lamdaV+alpha)

dvx = 2*(ballOne.velocity.x-ballTwo.velocity.x + a*(ballOne.velocity.y-ballTwo.velocity.y)) / ((1+(a*a))*(1+mTwo /mOne ))

ballTwo.velocity.x = ballTwo.velocity.x + dvx
ballTwo.velocity.y = ballTwo.velocity.y + (a*dvx)
ballOne.velocity.x = ballOne.velocity.x - ((mTwo/mOne)*dvx)
ballOne.velocity.y = ballOne.velocity.y - (a*(mTwo/mOne)*dvx)

#Graph the Velocities
ballRY.plot(pos = (t, ballOne.velocity.y))
ballRX.plot(pos = (t, ballOne.velocity.x))
ballBY.plot(pos = (t, ballTwo.velocity.y))
ballBX.plot(pos = (t, ballTwo.velocity.x))

t=t+deltat

No comments:

Post a Comment