如何设置多个球的动画-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,所以我们希望您在提出要求之前做好准备。