如何为多个球制作动画 - python

时间:2018-04-15 12:24:04

标签: 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 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() 

然后我尝试添加到我的循环

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) )

制作多个球的新循环。 这是新的循环并且它无法正常工作

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) )

该程序保持动画1球,而不是其他球。 附:我是python中的初学者和大部分动画部分,我从一个由我的教授交给我的现成脚本中提取。 请注意,其中一些值已经放置,以便我可以在以后更改它们:C = 1

0 个答案:

没有答案