rendered paste bodyfrom visual import*
from visual.graph import*
#In Xanadu did Kublai Khan a stately pleasure-dome decree#
# Kinematic graphs
fg_color = color.white
bg_color = color.black
gc_color = color.red
#velocity graph
vel_graph = gdisplay(x=610, y=100, width=300, height=200,title= 'Car velocity vs. time',
xtitle='t (s)', ytitle='v (m/s)', xmax= 6., xmin= 0., ymax=3., ymin=-3.,
foreground=fg_color, background=bg_color)
vel_Plot = gcurve(color=gc_color)
#position graph
pos_graph = gdisplay(x=610, y=300, width=300, height=200, title= 'Car position',
xtitle='x position (m)', ytitle='y position (m)', xmax= 2.5, xmin= -1, ymax=2.5,
ymin= 0., foreground=fg_color, background=bg_color)
pos_Plot = gcurve (color=gc_color)
#Work graph
work_graph = gdisplay(x=610, y=600, width=300, height=200, title='Energy Loss to Friction vs. Time', xtitle='t(s)',
ytitle='Work/mass', xmax= 2., xmin=0., ymax=10., ymin=0., foreground=fg_color,
background=bg_color)
work_plot = gcurve(color=gc_color)
#input_parameters
sign=1.
mu = .025 #coeffecient of friction
R = .38 #radius of track
r = .01 #center of mass distance
R=R-r
g = 9.8 #gravity
h = .37 #starting height
k = 0 #traversal number
car = sphere(pos=(0,h,0), radius=0.01, color=color.green)
car.trail = curve(color=car.color)
#initial conditions
#theta = acos(.26/.34)
theta = asin(.26/.34)
omega = 0.
alfa = -g*sin(theta)/R - sign*mu*(omega*omega+g*cos(theta)/R)
car.vel = vector(0.,0.,0.)
max_time = 2
time = 0.
dt = .00005
#initial angular velocity and velocity around loop
omega= -sqrt(2*g*(h-R*(1-cos(theta)))*(1-mu/tan(theta)))/R
v=omega*R
#Initial angular acceleration alfa
alfa = -g*sin(theta)/R + mu*(g*cos(theta)/R + omega*omega)
scale = .07
bv = arrow(pos=car.pos, axis = scale*car.vel,color = color.blue)
#THE LOOP
while time < max_time:
rate(1500 )
#make one step
#new angle
theta += omega*dt + .5*alfa*dt*dt
#new cartesian coordinates
car.pos = vector(R*sin(theta), R*(1-cos(theta)), 0.)
#new Velocity
v = omega*R
car.vel = vector(v*cos(theta),v*sin(theta),0)
#plot points
vel_Plot.plot(pos=(time, v))
pos_Plot.plot(pos=(car.pos.x, car.pos.y))
#new ball arrow
bv.pos = car.pos
bv.axis = scale*car.vel
#new car trail
car.trail.append(pos = car.pos)
#New time
time += dt
#new angular acceleration
omega_old=omega
if omega < 0:
sign = -1
else:
sign = 1
alfa = -g*sin(theta)/R - sign*mu*(omega*omega + g*cos(theta)/R)
#calculate new angular velocity
omega += alfa*dt
#Print out the traversal number and maximum height
#if omega changes sign
if(omega_old<0. and omega>0.) or (omega_old>0. and omega<0.) :
k=k+1
print"pass number =",k
print "maximum car height for pass", k, "= ", car.pos.y