如何设置多个球的动画-python
我想动画多个球反弹的边界上,但不是对方。高度边界应以用户确定的恒定速度移动 所以我试着先让球在我设定的边界内移动。 以下是脚本:如何设置多个球的动画-python,python,python-3.x,animation,matplotlib,Python,Python 3.x,Animation,Matplotlib,我想动画多个球反弹的边界上,但不是对方。高度边界应以用户确定的恒定速度移动 所以我试着先让球在我设定的边界内移动。 以下是脚本: import matplotlib import matplotlib.pyplot as plt from matplotlib import animation from matplotlib.widgets import Slider, Button, RadioButtons import numpy as np from time import sle
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import animation
from matplotlib.widgets import Slider, Button, RadioButtons
import numpy as np
from time import sleep
import numpy.random as rnd
def norme ( vecteur ):
return np.sqrt( np.dot(vecteur,vecteur) )
B = int(input( "How many balls: " ) )
N=1000
C=1
sx = 1000
sy = 200
Vmax = 50000
VY = 50000
class ball:
def __init__(self):
self.x = rnd.randint(1,sx)
self.y = rnd.randint(1,sy)
self.vx = rnd.randint(1,Vmax)
self.vy = rnd.randint(1,VY)
b = ball()
p, v, balls = [], [], []
nv=np.sqrt(b.vx**2+b.vy**2)
dt = 100/ nv
for i in range(N):
b.x += b.vx * dt
b.y += b.vy * dt
if( b.x >= 1000 or b.x <=0 ):
b.vx = - b.vx/C
if( b.y >= 200 or b.y < 0 ):
b.vy = -b.vy*C
p.append( (b.x,b.y) )
v.append( (b.vx,b.vy) )
fig = plt.figure()
mes_axes = plt.axes(xlim=(0, sx), ylim=(0, sy) )
mes_axes.set_title("Balle")
TexteX = " Paroi amorphe si C = " + str(C) + " est < 1 "
TexteY = " Paroi impulsive si 1/C = " + str(1./C) + " est > 1 "
plt.xlabel(TexteX)
plt.ylabel(TexteY)
balle, = mes_axes.plot( [], [], marker = 'o', markersize = 15.0 )
def initialise():
balle.set_data( [], [] )
return balle,
def AvanceBalle(n,mes_axes,fig):
x, y = p[n]
vx, vy = v[n]
balle.set_data( p[n] )
return balle,
anim = animation.FuncAnimation(fig,AvanceBalle,init_func=initialise,interval=100,frames=N, fargs=(mes_axes,fig), blit=True )
plt.show()
导入matplotlib
将matplotlib.pyplot作为plt导入
从matplotlib导入动画
从matplotlib.widgets导入滑块、按钮、单选按钮
将numpy作为np导入
从时间上导入睡眠
将numpy.random作为rnd导入
def标准(矢量):
返回np.sqrt(np.dot(矢量,矢量))
B=int(输入(“多少球:”)
N=1000
C=1
sx=1000
sy=200
Vmax=50000
VY=50000
班级舞会:
定义初始化(自):
self.x=rnd.randint(1,sx)
self.y=rnd.randint(1,sy)
self.vx=rnd.randint(1,Vmax)
self.vy=rnd.randint(1,vy)
b=球()
p、 v,球=[],[],[]
nv=np.sqrt(b.vx**2+b.vy**2)
dt=100/nv
对于范围(N)中的i:
b、 x+=b.vx*dt
b、 y+=b.vy*dt
如果(b.x>=1000或b.x=200或b.y<0):
b、 vy=-b.vy*C
p、 附加((b.x,b.y))
v、 附加((b.vx,b.vy))
图=plt.图()
mes_轴=plt轴(xlim=(0,sx),ylim=(0,sy))
mes_轴。设置标题(“芭蕾”)
TexteX=“Paroi amorphe si C=“+str(C)+”est<1”
TexteY=“Paroi pulsive si 1/C=“+str(1./C)+”est>1”
plt.xlabel(TexteX)
plt.ylabel(TexteY)
balle,=mes_轴。绘图([],[],标记='o',标记大小=15.0)
def initialise():
balle.set_数据([],[])
返回芭蕾舞团,
def AvanceBalle(n轴,mes_轴,图):
x、 y=p[n]
vx,vy=v[n]
balle.set_数据(p[n])
返回芭蕾舞团,
anim=animation.FuncAnimation(fig,AvanceBalle,init_func=initialise,interval=100,frames=N,fargs=(mes_轴,fig),blit=True)
plt.show()
然后我尝试添加到我的循环中
for i in range(N):
b.x += b.vx * dt
b.y += b.vy * dt
if( b.x >= 1000 or b.x <=0 ):
b.vx = - b.vx/C
if( b.y >= 200 or b.y < 0 ):
b.vy = -b.vy*C
p.append( (b.x,b.y) )
v.append( (b.vx,b.vy) )
范围(N)内的i的:
b、 x+=b.vx*dt
b、 y+=b.vy*dt
如果(b.x>=1000或b.x=200或b.y<0):
b、 vy=-b.vy*C
p、 附加((b.x,b.y))
v、 附加((b.vx,b.vy))
一个新的循环,使多个球。
这是新的循环,它不工作
for i in range(B):
b = ball()
balls.append(b)
for i in range(B):
x,y,vx,vy=balls[i].x,balls[i].y,balls[i].vx,balls[i].vy
xax.append((x,y))
yax.append((vx,vy))
for i in range(N):
x += vx * dt
y += vy * dt
if( x >= 1000 or x <=0 ):
vx = - vx/C
if( y >= 200 or y < 0 ):
vy = -vy*C
p.append( (x,y) )
v.append( (vx,vy) )
范围(B)内的i的:
b=球()
球.附加(b)
对于范围(B)中的i:
x、 y,vx,vy=balls[i].x,balls[i].y,balls[i].vx,balls[i].vy
附加((x,y))
附加((vx,vy))
对于范围(N)中的i:
x+=vx*dt
y+=vy*dt
如果(x>=1000或x=200或y<0):
vy=-vy*C
p、 附加((x,y))
v、 附加((vx,vy))
程序将继续为一个球设置动画,而不是其他球。
另外,我是python的初学者,大部分动画部分都是从教授交给我的现成脚本中提取的。
请注意,这些值中的一些被放置,以便我以后可以更改它们,例如:C=1更新函数
AvanceBalle
需要设置3个球的数据,而不是一个球的数据。类似地,p
和v
需要返回3个球的数据,而不是一个球的数据(目前,您似乎将3个球的运动附加到一个“p”和一个“v”)。我明白您的意思,但您能告诉我如何更新函数AvanceBalle吗。我几乎不知道这个函数是如何工作的,因为我带了一个现成的。如果你能给我一些指导,我建议你首先仔细阅读FuncAnimation
的文档,了解你目前掌握的代码。我们很乐意帮助解决技术问题,但在这方面,我们不是在编写训练营101,所以我们希望您在提出要求之前做好准备。