首页 > 解决方案 > python抛物线拍摄动画与matplotlib

问题描述

我的问题是 circle 不是可迭代的,我该如何解决?我希望抛物线镜头与圆圈一起使用。

import numpy as np
import matplotlib.pyplot as plt

from matplotlib import animation, rc
from IPython.display import HTML

plt.style.use('dark_background')
ax = plt.axes(xlim=(-5, 25), ylim=(-5, 25))
patch = plt.Circle((1, -1), 0.5, fc='b') #figura

X = 30
Y = 30
gravity=9.81
angle=70
velocity=80
vx=velocity * np.cos(np.radians(angle))
vy=velocity * np.sin(np.radians(angle))
t=0

def setup():
    patch.center = (10, 10)
    ax.add_patch(patch)
    return patch

def throwBall():
    global X, Y,  gravity, t,vx,vy

    t +=0.02
    X = vx*t
    Y = 400 -(vy*t - (gravity/2)*t*t)

    patch.center = (X, Y)
    return patch


animen = animation.FuncAnimation(fig, throwBall,init_func=setup,frames=360,interval=15,blit=True)

HTML(animen.to_html5_video())

标签: pythonnumpymatplotlib

解决方案


@JohanC 说的差不多。根据文档,如果blit=True“func 必须返回所有被修改或创建的艺术家的迭代”。因此,您必须返回一个艺术家列表或一个元组,即使只有一位艺术家被修改。

我也做了一些外观上的改变。如果您t在更新函数中递增,为什么不直接将 t 的值作为参数传递给您的更新函数 usingframes = np.arange(0,7.2,0.02)或等效的东西。

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


fig = plt.figure()
ax = fig.add_subplot(111, xlim=(0, 500), ylim=(0, 500), aspect='equal')
patch = Circle((1, -1), 10, fc='b')
ax.add_patch(patch)

X = 30
Y = 30
gravity=9.81
angle=70
velocity=80
vx=velocity * np.cos(np.radians(angle))
vy=velocity * np.sin(np.radians(angle))

def setup():
    patch.set_center((X, Y))
    return (patch,)

def throwBall(t):
    global X, Y
    X = vx*t
    Y = 400 -(vy*t - (gravity/2)*t*t)
    patch.set_center((X, Y))
    return (patch)


ani = animation.FuncAnimation(fig, throwBall, init_func=setup, frames=np.arange(0,7.2,0.02), interval=20, blit=True)

推荐阅读