Как анимировать движущийся мяч

#python #matplotlib #animation

Вопрос:

Я пытаюсь сделать очень простую анимацию и переместить мяч из одной позиции в другую. Я попытался создать класс и метод мяча для перемещения мяча с заданной скоростью, положением и временем. Однако вывод не обновляет положение шара, как было предсказано, а остается в том же положении. Код можно посмотреть ниже:

 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):
        newpos = self._pos   self._vel*dt
        self._pos = newpos
        self._patch = pl.Circle((self._pos),self._r,fc='red',ec='black')
        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)
pl.pause(5)
pl.show()
 

Я попытался выяснить, что не так, но self._patch обновляет свою позицию, и если я добавлю.add_patch новый патч, то он появится — однако на графике есть два шара. Любая помощь была бы очень признательна.

Ответ №1:

Когда я запустил код, я заметил, что патч не обновлялся на графике, но положение шара менялось, как и ожидалось, — чтобы обойти это, я добавил 2 строки в move(self, dt) функцию. Первый удаляет старый патч, а второй добавляет новый патч с обновленной позицией.

 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):
        newpos = self._pos   self._vel*dt
        self._pos = newpos
        self._patch.remove()
        self._patch = pl.Circle((self._pos),self._r,fc='red',ec='black')
        ax.add_patch(self._patch)
        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)
pl.pause(5)

pl.show()