# Ball Launch

Activity Information

Learning Goals

• Understand how the following effect motion of a projectile:
• Launch angle
• Launch velocity
• Free fall acceleration
• Apply Newton’s 2nd Law to relate the acceleration of a ball in midair ( HS-PS2-1)

Prior Knowledge Required

• 2-Dimensional kinematics
• Projectile motion
• Newton’s 2nd Law
• Drag

Code Manipulation

• Interpretation of pre-existing code
• Changing values of given code

Activity

Handout – Ball Launch

##### Part 1

Copy and paste the code from this GlowScript program. Click the button to launch the ball. Your goal is to hit the target.

1. What 3 variables can you change that might enable the ball to hit the target? Ignore drag for right now.
1. Variable 1:
2. Variable 2:
3. Variable 3:
2. Now edit these variables and run the program until the ball successfully hits the target. Repeat twice more with different combinations of variables. Record your trials below:
##### Part 2

Answer the following questions that are related to the program and projectile motion.

1. What do the green arrows represent? How do they change over time?
2. What do the blue arrows represent? How do they change over time?
3. How does changing the mass of the ball affect the motion of the ball and the size of the arrows?
##### Part 3

Extra: Within the code you’ll find a reference to the drag coefficient (line 27). Change the value to something between 0.01 and 0.001. Click to “Run this program”.

1. Describe how the motion is different now that drag is incorporated into the program
2. How are the blue arrows different from the trials without drag?
3. Now, with drag included, modify the variables until the ball hits the target again, and record your results in the table below:

Code

``````GlowScript 2.7 VPython
get_library('https://rawgit.com/perlatmsu/physutil/master/js/physutil.js')

#objects
x = 0
y = 0
ball = sphere(pos=vector(x,y,0), radius=10, color=vector(1,0,0), texture=textures.rough, make_trail=True)
ballmass = 1

platform = box(pos=vector(0,-25,0), length=100, height=50, width=1, color=color.orange)
pL = label(pos=vector(0,200,0), text='Click to Launch', space=30, height=16, border=4, font='sans')

target = box(pos=vector(800,-25,0), length=100, height=50, width=1, color=vector(0.8,0.8,0))
tL = label(pos=vector(800,-75,0), text='Target', space=30, height=16, border=4, font='sans')

#Window setup
scene.range = 600
scene.center = vector(760,100,0)
scene.width = 960
scene.height = 600
scene.background = vector(0.5,0.5,0.5)

#Parameters and Initial Conditions
g = vector(0,-10,0) #Free Fall acceleration
b = 0  #Drag coefficient

#Time and time step
t = 0
tf = 10
dt = 0.01

#velocity
v0 = 100
theta = 45
vx = v0*cos(theta*pi/180)
vy = v0*sin(theta*pi/180)
ballv = vector(vx,vy,0)

#motion map
motionmapv = MotionMap(ball, tf, 5, markerScale=.8, markerColor=color.green, labelMarkerOrder=False)
motionmapa = MotionMap(ball, tf, 5, markerScale=6, markerColor=color.blue, labelMarkerOrder=False)

#graph
gd = graph(width=600, height=250, title='<b>Horizontal Range vs. Time</b>',
xtitle='<i>time</i>', ytitle='<i>Horizontal Range</i>',
foreground=color.black, background=color.white,
xmin=0, xmax=15, ymin=0, ymax=1000)
rangecurve = gcurve(color=color.red)

gd = graph(width=600, height=250, title='<b>Height vs. Time</b>',
xtitle='<i>time</i>', ytitle='<i>Height</i>',
foreground=color.black, background=color.white,
xmin=0, xmax=15, ymin=0, ymax=1000)
heightcurve = gcurve(color=color.green)

ev = scene.waitfor('click')

while ball.pos.y >= 0:
rate(500)

Fgrav = ballmass*g
Fnet = Fgrav

balla = Fnet/ballmass

ball.pos = ball.pos + ballv*dt
ballv = ballv + balla*dt

motionmapv.update(t, ballv)
motionmapa.update(t, balla)

rangecurve.plot(t,ball.pos.x)
heightcurve.plot(t,ball.pos.y)

t = t + dt

print (x)
print (y)
print (vx)
print (vy)
print (t)``````

Handout

##### Part 1
1. The three variables:
1. Initial Speed (line 36)
2. Launch Angle (line 37)
3. Free Fall Acceleration (Line 26)
2. Possible results:
##### Part 2
1. The green arrows represent the velocity of the ball. They start out large, decrease in size, then get large again. They always point in the direction that is tangent to the path of the ball. This is consistent with the fact that the velocity of the ball slows down and then speeds up as it flies through the air
2. The blue arrows represent the acceleration of the ball. They stay the same size for the entire trip and always point downwards. This is consistent with the fact that the only force, and thus acceleration, acting on the ball is gravity
3. Changing the mass of the ball has no effect on the motion of the ball, nor the size of the arrows. This is because the acceleration stays the same; a heavier ball experiences a greater gravitational force, and the ratio between force and mass (which is the definition of acceleration) is always constant. The velocity is the same as dictated by the code, although in a real setting a heavier ball would have to be pushed harder to achieve the same velocity.
##### Part 3
1. The ball will not fly as far. While the original flight path (sans drag) is a symmetrical parabola, the new flight path (with drag) starts relatively parabolic but becomes compressed or squished towards the end
2. The blue arrows now represent the acceleration caused but the combined effects of gravitational force and drag force (which points opposite the velocity vector). In the first half of the launch, both drag and gravity have downward components creating a large resultant acceleration vector, while in the second half, the drag force points mostly up, thereby summing to a smaller resultant acceleration vector.
3. Possible results:

Code

``````GlowScript 2.7 VPython
get_library('https://rawgit.com/perlatmsu/physutil/master/js/physutil.js')

#objects
x = 0
y = 0
ball = sphere(pos=vector(x,y,0), radius=10, color=vector(1,0,0), texture=textures.rough, make_trail=True)
ballmass = 10

platform = box(pos=vector(0,-25,0), length=100, height=50, width=1, color=color.orange)
pL = label(pos=vector(0,200,0), text='Click to Launch', space=30, height=16, border=4, font='sans')

target = box(pos=vector(800,-25,0), length=100, height=50, width=1, color=vector(0.8,0.8,0))
tL = label(pos=vector(800,-75,0), text='Target', space=30, height=16, border=4, font='sans')

#Window setup
scene.range = 600
scene.center = vector(760,100,0)
scene.width = 960
scene.height = 600
scene.background = vector(0.5,0.5,0.5)

#Parameters and Initial Conditions
g = vector(0,-8,0) #Free Fall acceleration
b = 0.000  #Drag coefficient

#Time and time step
t = 0
tf = 10
dt = 0.01

#velocity
v0 = 60
theta = 55
vx = v0*cos(theta*pi/180)
vy = v0*sin(theta*pi/180)
ballv = vector(vx,vy,0)

#motion map
motionmapv = MotionMap(ball, tf, 5, markerScale=.8, markerColor=color.green, labelMarkerOrder=False)
motionmapa = MotionMap(ball, tf, 5, markerScale=6, markerColor=color.blue, labelMarkerOrder=False)

#graph
gd = graph(width=600, height=250, title='<b>Horizontal Range vs. Time</b>',
xtitle='<i>time</i>', ytitle='<i>Horizontal Range</i>',
foreground=color.black, background=color.white,
xmin=0, xmax=15, ymin=0, ymax=1000)
rangecurve = gcurve(color=color.red)

gd = graph(width=600, height=250, title='<b>Height vs. Time</b>',
xtitle='<i>time</i>', ytitle='<i>Height</i>',
foreground=color.black, background=color.white,
xmin=0, xmax=15, ymin=0, ymax=1000)
heightcurve = gcurve(color=color.green)

ev = scene.waitfor('click')

while ball.pos.y >= 0:
rate(500)

Fgrav = ballmass*g
Fdrag = -b*ballv*mag(ballv)
Fnet = Fgrav + Fdrag

balla = Fnet/ballmass

ball.pos = ball.pos + ballv*dt
ballv = ballv + balla*dt

motionmapv.update(t, ballv)
motionmapa.update(t, balla)

rangecurve.plot(t,ball.pos.x)
heightcurve.plot(t,ball.pos.y)

t = t + dt

print (x)
print (y)
print (vx)
print (vy)
print (t)``````