如何用 matplotlib 制作对象 A 从给定高度向上抛出然后自由落体的动画?

问题描述 投票:0回答:1

使用Python 3.12,Matplotlib 3.9.2,

从高度 h=20(m) 开始,以给定的速度 v 向上抛物体 A,并放下物体 B,使其自由落体。空气阻力可以忽略不计。计算 v,使对象 A 在对象 B 和动画之后落到地面 dt =2 秒。 g = 9.81(米/秒2)

我一直在尝试使用“set_data”使用 matplotlib 对上述问题进行动画处理,但结果并不令人满意,因为保留了 A 的先前位置,这使得动画在一段时间后自行重叠。我想删除以前的数据,但我找不到任何功能来帮助它。

这是我使用过的代码:

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

#Input Variables
h, g, dt= 20, 9.81, 2

#Calculated Variables
tmp = np.sqrt(2*h/g) + dt
v = 0.5*g*tmp - h/tmp 

#Arrays 
t = np.linspace(0, tmp , 100)
hA = h + v*t - 0.5*g*t**2
hB = h - 0.5*g*t**2

#Plot
fig, ax = plt.subplots()
plt.axis([0, 10, 0, 100])
ax.set_title("Physic 1")
plt.grid()

#Define object A and object B
A, = ax.plot([],[],"o",markersize=4,color="red")
B, = ax.plot([],[],"o",markersize=4,color="blue")

#Animation
def animate(frame):
    A.set_data([2],hA[:frame])
    B.set_data([6],hB[:frame])
    return A,B

ani=FuncAnimation(fig, animate, frames=len(t)+2, interval=25, repeat =False)
plt.show()
python matplotlib animation physics
1个回答
0
投票

当您使用

hA[:frame]
时,您会将所有点传递到索引
frame
。由于您只想要一个索引,因此您应该这样做
hA[frame]
。您需要将该结果包装在一个列表中,以便 y 是一个序列(否则您会收到注释中提到的错误)。最后,你会得到这个:

def animate(frame):
    A.set_data([2], [hA[frame]])
    B.set_data([6], [hB[frame]])
    return A, B

这也可以使用散点图来完成,将相应的线更改为:

# the zorder argument puts the scatter points on top of the grid markings
A = ax.scatter([], [], s=16, color="red", zorder=2)
B = ax.scatter([], [], s=16, color="blue", zorder=2)

def animate(frame):
    A.set_offsets([2, hA[frame]])
    B.set_offsets([6, hB[frame]])
    return A, B

最后,您的

hA
hB
数组与
t
的长度相同,因此帧数应该是
len(t)
,而不是
len(t)+2

© www.soinside.com 2019 - 2024. All rights reserved.