# 原 matplotlib动画入门(3):弹球

## 代码

```import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation```

```class ParticleBox:
'''
初始化方法
init_state是一个数组:[x,y,vx,vy]，四个值分别表示x坐标，y坐标，x方向的速度，y方向的速度
bounds 是箱子的边界: [xmin, xmax, ymin, ymax]
size: 球的半径
'''
def __init__(self,
init_state = [1,0,0.5,1],
bounds = [-2, 2, -2, 2],
size = 0.04):
self.init_state = np.asarray(init_state, dtype=float)
self.size = size
self.state = self.init_state.copy()
self.bounds = bounds

'''
每一帧动画调用一次step函数，画出小球的位置。
dt是每一帧代表的时间，其乘以速度就是运动的距离
'''
def step(self, dt):

'''
x = x + dt * vx
y = y + dt * vy
'''
self.state[:2] += dt * self.state[2:]

'''
如果弹球碰到墙，就弹回来
'''
crossed_x1 = (self.state[0] < self.bounds[0] + self.size)
crossed_x2 = (self.state[0] > self.bounds[1] - self.size)
crossed_y1 = (self.state[1] < self.bounds[2] + self.size)
crossed_y2 = (self.state[1] > self.bounds[3] - self.size)

if crossed_x1:
self.state[0] = self.bounds[0] + self.size
if crossed_x2:
self.state[0] = self.bounds[1] - self.size
if crossed_y1:
self.state[1] = self.bounds[2] + self.size
if crossed_y2:
self.state[1] > self.bounds[3] - self.size
#反方向运动
if crossed_x1 | crossed_x2 :
self.state[2] *= -1
if crossed_y1 | crossed_y2 :
self.state[3] *= -1   ```

```def animate(i):
global box, rect
box.step(dt)
rect.set_edgecolor('k')
particles.set_data(box.state[0], box.state[1])
particles.set_markersize(4)
return particles, rect```

```#随机取四个数作为起始位置和速度
init_state = np.random.random(4)
box = ParticleBox(init_state, size=0.04)
#每帧代表0.1秒
dt = 0.1

#画图
fig = plt.figure()
xlim=(-3.2, 3.2), ylim=(-2.4, 2.4))

particles, = ax.plot([], [], 'bo', ms=4)
rect = plt.Rectangle(box.bounds[::2],
box.bounds[1] - box.bounds[0],
box.bounds[3] - box.bounds[2],
ec='none', lw=2, fc='none')

ani = animation.FuncAnimation(fig, animate, frames=600,
interval=1, blit=False)

plt.show()```

```import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

class ParticleBox:
'''
init_state is an array:[x,y,vx,vy]
bounds 箱子的边界: [xmin, xmax, ymin, ymax]
size: 球的半径
'''
def __init__(self,
init_state = [1,0,0.5,1],
bounds = [-2, 2, -2, 2],
size = 0.04):
self.init_state = np.asarray(init_state, dtype=float)
self.size = size
self.state = self.init_state.copy()
self.bounds = bounds

'''
每一帧动画调用一次step函数，画出小球的位置。
dt是每一帧代表的时间，其乘以速度就是运动的距离
'''
def step(self, dt):

'''
x = x + dt * vx
y = y + dt * vy
'''
self.state[:2] += dt * self.state[2:]

'''
如果碰到墙，就弹回来
'''
crossed_x1 = (self.state[0] < self.bounds[0] + self.size)
crossed_x2 = (self.state[0] > self.bounds[1] - self.size)
crossed_y1 = (self.state[1] < self.bounds[2] + self.size)
crossed_y2 = (self.state[1] > self.bounds[3] - self.size)

if crossed_x1:
self.state[0] = self.bounds[0] + self.size
if crossed_x2:
self.state[0] = self.bounds[1] - self.size
if crossed_y1:
self.state[1] = self.bounds[2] + self.size
if crossed_y2:
self.state[1] > self.bounds[3] - self.size

if crossed_x1 | crossed_x2 :
self.state[2] *= -1
if crossed_y1 | crossed_y2 :
self.state[3] *= -1

def animate(i):
global box, rect
box.step(dt)
rect.set_edgecolor('k')
particles.set_data(box.state[0], box.state[1])
particles.set_markersize(4)
return particles, rect

#随机取四个数作为起始位置和速度
init_state = np.random.random(4)
box = ParticleBox(init_state, size=0.04)
#每帧代表0.1秒
dt = 0.1

#画图
fig = plt.figure()
xlim=(-3.2, 3.2), ylim=(-2.4, 2.4))

particles, = ax.plot([], [], 'bo', ms=4)
rect = plt.Rectangle(box.bounds[::2],
box.bounds[1] - box.bounds[0],
box.bounds[3] - box.bounds[2],
ec='none', lw=2, fc='none')

ani = animation.FuncAnimation(fig, animate, frames=600,
interval=1, blit=False)

plt.show()```

`python3 particle.py `

0 条评论

• ### 如何用遗传算法进化出一只聪明的小鹦鹉

现在有一些样本数据，如下表所示。你是否能找到其中的规律，然后计算出新样本的output是多少？

• ### Python代码搭建简单的神经网络

https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-ne...

• ### 人工智能算法通俗讲解系列(四)：xgboost

不要被这个名字吓唬到，其实它的基本原理并不复杂。要理解xgboost，需要首先理解决策树。还没有接触过决策树的同学可以看一下《人工智能算法通俗讲解系列(三)：决...

• ### Python高级进阶#015 pyqt5进度条QProgressBar结合使用qbasictimer

这里我们在学习使用进度条的时候，必须要结合使用时钟控件，这样才能让我们看到进度条动的感觉。

• ### Python系列之循环定时器

近期在学习并使用Python开发一些小工具，在这里记录方便回忆，也与各位开始走上这条路的朋友共勉，如有不正确希望指正，谢谢！