Анимация Boid в python

#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()
 

введите описание изображения здесь