#python #matplotlib
#python #matplotlib
Вопрос:
Я пытаюсь создать анимацию boid на python, но она не анимируется.
Сначала я настраиваю среду для boids — 2D-окно с размерами L x L
. Коробка на самом деле представляет собой тор — boid, вылетающий за правый край коробки, влетает с левого края и т. Д.
Позиции boid устанавливаются случайным образом от 0
до L
, углы также устанавливаются случайным образом от 0
до 2*pi
. Углы векторов скорости указывают цвета стрелок.
На данный момент предполагается, что boid должны лететь прямо вперед, но, похоже animation
, это дает мне представление о перекрывающихся первых двух кадрах.
Мой код:
import numpy as np
import scipy as scp
import matplotlib.pyplot as plt
from matplotlib import animation
#GLOBAL VARS
L = 32
N = 10
V_0 = 1
boid_pos = L*np.random.rand(2, N)
boid_angl = 2*scp.pi*np.random.rand(N)
def displacement(x, angl):
x_1 = x[0] V_0*np.cos(angl)
x_2 = x[1] V_0*np.sin(angl)
return np.vstack((x_1,x_2))
def check_bound(x):
x = np.where(x > L, x % L, x)
x = np.where(x < 0, -x % L, x)
return x
def evolution(t, x, angl, q, ax):
x = displacement(x, angl)
x = check_bound(x)
q = ax.quiver(x[0], x[1], np.cos(angl), np.sin(angl), angl)
return q
fig, ax = plt.subplots()
q = ax.quiver(boid_pos[0], boid_pos[1], np.cos(boid_angl), np.sin(boid_angl), boid_angl)
anim = animation.FuncAnimation(fig, evolution, fargs=(boid_pos, boid_angl, q, ax),
frames = np.arange(0,100,1), interval = 50)
fig.tight_layout()
plt.show()
Ответ №1:
Я не был уверен в вашей логике, поэтому я настроил образец quiver из официальной ссылки, чтобы анимировать его. Переменная i, которая должна быть зациклена, установлена на 30 раз, что задается в кадрах. Значение, отображаемое переменной i, изменяется. Это не очень хороший пример, но я думаю, он поможет вам понять базовую структуру.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
# from IPython.display import HTML
from matplotlib.animation import PillowWriter
X = np.arange(-10, 10, 1)
Y = np.arange(-10, 10, 1)
U, V = np.meshgrid(X, Y)
fig, ax = plt.subplots()
ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
q = ax.quiver([], [], [], [])
# ax.quiverkey(q, X=0.3, Y=1.1, U=10, label='Quiver key, length = 10', labelpos='E')
def animate(i):
X = np.arange(-i, i 1, 1)
Y = np.arange(-i, i 1, 1)
U, V = np.meshgrid(X, Y)
q = ax.quiver(X, Y, U, V)
return q
anim = animation.FuncAnimation(fig, animate, frames=30, interval=200)
anim.save('quiver_ani.gif', writer='pillow')
# fig.tight_layout()
plt.show()