2

I am trying to animate the path of a projectile launched with an initial velocity at an initial angle. I attempted to modify the code found here: http://matplotlib.org/examples/animation/simple_anim.html

My code looks like this:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

g = 9.8                               #value of gravity
v = 20                                #initial velocity
theta = 20*np.pi/180                  #initial angle of launch in radians
tt = 2*v*np.sin(theta)/g              #total time of flight
t = np.linspace(0, tt, 0.01)          #time of flight into an array
x = v*np.cos(theta)*t                 #x position as function of time
line, = ax.plot(x, v*np.sin(theta)*t-(0.5)*g*t**2) #plot of x and y in time

def animate(i):
    line.set_xdata(v*np.cos(theta)*(t+i/10.0))
    line.set_ydata(v*np.sin(theta)*(t+i/10.0)-(0.5)*g*(t+i/10.0)**2)  
    return line,

#Init only required for blitting to give a clean slate.
def init():
    line.set_xdata(np.ma.array(t, mask=True))
    line.set_ydata(np.ma.array(t, mask=True))
    return line,

ani = animation.FuncAnimation(fig, animate, np.arange(1, 200),
init_func=init, interval=25, blit=True)
plt.show()

The code, as shown, gives me plot window, but no trajectory and no animation. I've searched on here to see if this has been asked elsewhere, and I have yet to find it. If it has been asked, just link to the already answered question. Any help is greatly appreciated. Thanks all.

Gary
  • 55
  • 1
  • 6
  • Your code as is doesn't work - there are closing parenthesis missing in `animate()` and `init()`. I also get an `AttributeError: 'FigureCanvasMac' object has no attribute 'copy_from_bbox'` and `AttributeError: 'FigureCanvasMac' object has no attribute 'restore_region'` – Reblochon Masque Sep 26 '15 at 14:53

1 Answers1

4

I was able to get the following working with python 3.4.3:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

g = 9.8                                                        #value of gravity
v = 10.0                                                       #initial velocity
theta = 40.0 * np.pi / 180.0                                   #initial angle of launch in radians
t = 2 * v * np.sin(theta) / g                                  
t = np.arange(0, 0.1, 0.01)                                    #time of flight into an array
x = np.arange(0, 0.1, 0.01)
line, = ax.plot(x, v * np.sin(theta) * x - (0.5) * g * x**2)   # plot of x and y in time

def animate(i):
    """change the divisor of i to get a faster (but less precise) animation """
    line.set_xdata(v * np.cos(theta) * (t + i /100.0))
    line.set_ydata(v * np.sin(theta) * (x + i /100.0) - (0.5) * g * (x + i / 100.0)**2)  
    return line,

plt.axis([0.0, 10.0, 0.0, 5.0])
ax.set_autoscale_on(False)

ani = animation.FuncAnimation(fig, animate, np.arange(1, 200))
plt.show()

The axis needed to be re-scaled, & many other things changed.

It is not perfect, but shows a projectile following the required trajectory.

You can play with it now & have a look at the code and fiddle with it to learn. I also suggest that you invest a little bit of time to learn the basics of numpy/pyplot; that will pay hefty dividends down the road.

Reblochon Masque
  • 35,405
  • 10
  • 55
  • 80
  • 1
    Thanks. I can tweak it from here for my purposes. I'm running 2.7, but it still worked as expected. Thanks for the help! – Gary Sep 26 '15 at 16:47