2015-07-08 4 views
1

Я хотел бы моделировать движение основной толпы с помощью python. Я хочу показать анимацию. Я сделал следующую программу, чтобы проверить его с Matplotlib:Моделирование движения толпы с помощью matplotlib

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

#size of the crowd 
N = 100 

def gen_data(): 
    """ init position and speed of each people """ 
    x = y = np.zeros(N) 
    theta = np.random.random(N) * 360/(2 * np.pi) 
    v0 = 0.1 
    vx, vy = v0 * np.cos(theta), v0 * np.sin(theta) 
    return np.array([x, y, vx, vy]).T 

def init(): 
    for line in lines: 
     line.set_data([],[]) 
    return line, 

def update_lines(i, lines, data): 
    for d, line in zip(data, lines): 
     d[0:2] += d[2:4] 
     if abs(d[0]) > 5: d[2] *= -1 
     if abs(d[1]) > 5: d[3] *= -1 
     line.set_data(d[0] ,d[1]) 
    return lines 

fig = plt.figure() 
ax = plt.axes(xlim=(-5,5),ylim=(-5,5)) 
lines = [plt.plot([],[], 'ko')[0] for i in range(N)] 

data = gen_data() 

anim = animation.FuncAnimation(fig, update_lines, init_func=init, fargs=(lines, data), interval=10, blit=True) 

plt.show() 

Даже при N = 100, анимация медленно ... есть то, что я могу сделать, чтобы ускорить его с mathplotlib? Является ли matplotlib лучшим графическим инструментом, чтобы сделать тонкую анимацию с помощью python? Если нет, что бы это было?

ответ

3

Вот 3 вещи, которые вы можете сделать, чтобы сделать анимацию быстрее:

  • Замените N вызовы plt.plot с один вызов к plt.scatter.
  • Заменить for-loop в update с заданиями, которые модифицируют целые кусочки из data сразу:

    data[:, 0:2] += data[:, 2:4] 
    data[:, 2] = np.where(np.abs(data[:, 0]) > 5, -data[:, 2], data[:, 2]) 
    data[:, 3] = np.where(np.abs(data[:, 1]) > 5, -data[:, 3], data[:, 3]) 
    
  • Уменьшить interval=10 в interval=0.


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

# size of the crowd 
N = 100 

def gen_data(): 
    """ init position and speed of each people """ 
    x = y = np.zeros(N) 
    theta = np.random.random(N) * 360/(2 * np.pi) 
    v0 = 0.1 
    vx, vy = v0 * np.cos(theta), v0 * np.sin(theta) 
    return np.column_stack([x, y, vx, vy]) 

def init(): 
    pathcol.set_offsets([[], []]) 
    return pathcol, 

def update(i, pathcol, data): 
    data[:, 0:2] += data[:, 2:4] 
    data[:, 2] = np.where(np.abs(data[:, 0]) > 5, -data[:, 2], data[:, 2]) 
    data[:, 3] = np.where(np.abs(data[:, 1]) > 5, -data[:, 3], data[:, 3]) 
    pathcol.set_offsets(data[:, 0:2]) 
    return [pathcol] 

fig = plt.figure() 
ax = plt.axes(xlim=(-5, 5), ylim=(-5, 5)) 
pathcol = plt.scatter([], []) 
data = gen_data() 
anim = animation.FuncAnimation(fig, update, init_func=init, 
           fargs=(pathcol, data), interval=0, blit=True) 
plt.show() 
Смежные вопросы