Python анимация странного поведения - PullRequest
0 голосов
/ 05 апреля 2020

Я делаю анимацию запущенного снаряда и сталкиваюсь с каким-то странным поведением, которое я не понимаю. Я строю анимацию точки, представляющей объект, а также анимирую путь, чтобы траектория обнаруживалась за объектом. Однако, когда я делаю это так, как мне кажется, я должен это делать, точка показывается на один шаг впереди траектории, и траектория заканчивается на одну точку, не доходя до финиша. Я могу обойти это, увеличив индексный номер траектории, но тогда кажется, что индекс должен выйти за пределы в конце. Я действительно запутался и мог бы помочь понять, что происходит.

Я работаю в блокноте 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()

1 Ответ

0 голосов
/ 05 апреля 2020

В python синтаксис x[0:frames] определяет диапазон от 0 включительно до frames эксклюзив .

Итак, рассмотрим l oop:

  • На итерации 0 вы обновляете точку до x[0], y[0], а линейный график пуст: x[0:0], y[0:0] - пустые множества;
  • На итерации 1 вы обновили точку до x[1], y[1] и линия имеет только одну пару координат: x[0:1], y[0:1], недостаточно для формирования линии;
  • На итерации 2 точка находится на третьей позиции x[2], y[2], но линейный график отстает, поскольку x[0:2], y[0:2] содержит достаточно координат для двух точек, а именно для первой и второй точек, достаточно для формирования только первого сегмента, но не второго, необходимого для достижения точки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...