在Project Euler上做了一些问题,我遇到了Langdon's Ant,并认为尝试用Python编写动画代码是个不错的主意。作为基础,我去使用了matplotlib函数动画,在这篇文章中可以看到一个很好的例子here
我设法让版本正常工作,代码如下所示。我们的想法是模拟蚂蚁用大矩阵移动的黑白网格,然后使用' imshow'来绘制该矩阵。
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
# Initialize the Simulation
dim=50
a=np.matrix(np.zeros((dim,dim)))
pos=np.matrix([[dim//2],[dim//2]]) # current position of ant
direction=np.matrix([[1],[0]]) # direction ant is currently moving
#Rotation Matrices
clock=np.matrix([[0,1],[-1,0]])
counter=np.matrix([[0,-1],[1,0]])
def takestep(a,pos,direction):
pos[:]=pos+direction
if a[pos[0,0],pos[1,0]]==0: #landed on white
a[pos[0,0],pos[1,0]]=1
direction[:]=clock*direction
else:
a[pos[0,0],pos[1,0]]=0
direction[:]=counter*direction
#Plotting
fig = plt.figure()
im=plt.imshow(a,interpolation='none')
def init():
im=plt.imshow(a,interpolation='none')
return [im]
def animate(i):
takestep(a,pos,direction)
im=plt.imshow(a,interpolation='none')
#im.set_data(np.array(a))
return [im]
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=200, interval=0, blit=True)
此代码功能正常,但我不清楚某些事情:
动画连续运行(直到蚂蚁超出界限)和 在200帧之后不会重置
即使间隔设置为0,动画运行速度也很慢,每秒更新两次
我想我可以通过使用im.set_data()函数(在代码中注释掉)加快速度,在我的实现中,这不起作用(不变的可视化)
< / LI>如果有人能给我一些关于如何改进这个动画的指示,那将是非常好的,谢谢!
祝你好运, 圣拉斐尔
答案 0 :(得分:1)
以下是使用im.set_data
来提高帧数/秒的方法。
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
# Initialize the Simulation
dim = 50
a = np.matrix(np.zeros((dim, dim)))
pos = np.matrix([[dim // 2], [dim // 2]]) # current position of ant
direction = np.matrix([[1], [0]]) # direction ant is currently moving
# Rotation Matrices
clock = np.matrix([[0, 1], [-1, 0]])
counter = np.matrix([[0, -1], [1, 0]])
def takestep(a, pos, direction):
pos[:] = pos + direction
if a[pos[0, 0], pos[1, 0]] == 0: # landed on white
a[pos[0, 0], pos[1, 0]] = 1
direction[:] = clock * direction
else:
a[pos[0, 0], pos[1, 0]] = 0
direction[:] = counter * direction
fig = plt.figure()
im = plt.imshow(a, interpolation='none', vmin=0, vmax=1)
def animate(i):
takestep(a, pos, direction)
im.set_data(a)
return [im]
anim = animation.FuncAnimation(fig, animate,
frames=200, interval=0, blit=True,
repeat=False)
plt.show()
repeat=False
在200帧后停止动画。vmin=0, vmax=1
的初始通话中设置imshow
。对plt.imshow
的初始调用设置vmin
和vmax
,它们控制值和颜色之间的对应关系。该设置用于imshow AxesImage的所有后续渲染。由于初始plt.imshow
使用全零数据,vmin
和vmax
都设置为0(初始数据的最小值和最大值)。这使得所有值显示为相同的颜色。因此,要阻止这种情况发生,请自行提供vmin
和vmax
。