#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()