You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现小球移动动画?调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:45:03