如何实现小球移动动画?调用move方法后位置不更新如何解决
问题根因
- 你在
move方法中每次创建新的Circle实例赋值给self._patch,但最初添加到axes上的是初始化时生成的旧Circle实例,两者无关联,修改self._patch指向不会影响画布上已有的旧实例,因此看不到位置更新。 - 若每次移动都调用
ax.add_patch添加新的Circle,就会出现多个小球重叠的问题。
修复方案
不需要每次移动都新建Circle对象,直接修改原有patch的center属性即可,修改后触发画布重绘就能更新显示位置。
修改后的完整代码如下:
import pylab as pl import numpy as np pl.matplotlib.use('Qt5Agg') class ball: def __init__(self,pos,vel,r=1,m=1): self._pos = np.array(pos,dtype="float64") self._vel = np.array(vel,dtype="float64") self._r = r self._mass = m self._patch=pl.Circle((self._pos),self._r, fc='red',ec='black') def move(self,dt): self._pos += self._vel*dt # 直接修改原有patch的中心位置,无需新建实例 self._patch.center = (self._pos[0], self._pos[1]) return self k=ball([0,0],[7,9]) f=pl.figure() ax = pl.axes(xlim=(-10, 10), ylim=(-10, 10),aspect='1') ax.add_patch(k._patch) print(k._patch) pl.pause(5) k.move(1) # 修改patch属性后主动触发画布重绘 f.canvas.draw_idle() pl.pause(5) pl.show()
如果需要实现连续动画效果,也可以直接使用matplotlib内置的FuncAnimation接口,避免手动管理重绘逻辑。
内容的提问来源于stack exchange,提问作者Bad_physicist
相关产品推荐
相关产品推荐

