Я делаю анимацию запущенного снаряда и сталкиваюсь с каким-то странным поведением, которое я не понимаю. Я строю анимацию точки, представляющей объект, а также анимирую путь, чтобы траектория обнаруживалась за объектом. Однако, когда я делаю это так, как мне кажется, я должен это делать, точка показывается на один шаг впереди траектории, и траектория заканчивается на одну точку, не доходя до финиша. Я могу обойти это, увеличив индексный номер траектории, но тогда кажется, что индекс должен выйти за пределы в конце. Я действительно запутался и мог бы помочь понять, что происходит.
Я работаю в блокноте Jupyter и привел минимально работающий пример ниже. В настоящее время я просто использую 10 точек в моей команде linspace и сильно замедлил анимацию, чтобы вы могли видеть, что происходит. Если я использую команду line1.set_data(x[0:frames+1], y[0:frames+1])
вместе с point1.set_data(x[frames], y[frames])
в функции анимации, то все выглядит хорошо. Но похоже, что это не должно работать!
Чего мне не хватает?
%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
# Global constants
g = 9.8 # gravitational field strength in m/s^2
v0 = 40.0 # initial speed in m/s
theta = 30.0 # Launch angle in degrees
# determine trajectory
theta_rad = np.pi*theta/180
t = np.linspace(0, 2*v0*np.sin(theta_rad)/g, 10)
x = v0*np.cos(theta_rad)*t
y = v0*t*np.sin(theta_rad) - g*t**2/2
# Plot the results
fig1 = plt.figure(figsize=(6,4))
ax1 = fig1.add_subplot(111)
line1, = ax1.plot(x[0:1], y[0:1], 'b-', label='no drag')
point1, = ax1.plot(x[0], y[0], 'bo', ms=3)
ax1.set_xlim(0, 170)
ax1.set_ylim(0, 50)
plt.show()
# Animation update function
def animate(frames):
line1.set_data(x[0:frames], y[0:frames])
point1.set_data(x[frames], y[frames])
return
ani = animation.FuncAnimation(fig1, animate, frames=len(t), interval=1000, blit=True, repeat=False)
plt.show()