Я должен оживить два объекта вместе как единое целое. Один объект - это прямоугольник, а другой объект - это множество дуг, которые образуют фонтан, начиная с центральной точки прямоугольника. Я создал функцию для построения дуг через центр прямоугольника, как показано на рисунке.
Описание проблемы: Я хочу анимировать это объединенное изображение (прямоугольник + связка дуг вместе) и заставить его выглядеть прогрессирующим вперед на каждый шаг по времени. Для этого я создал функцию с matplotlib animate. Прямоугольник как отдельный анимирует отлично. Где, поскольку дуги не движутся вперед вместе с прямоугольником при анимации.
Текущий вывод: В моей анимации движется либо только прямоугольник, либо только один ar c из группы дуг. Я не могу понять, что я делаю не так.
Ожидаемый результат: Может кто-нибудь предложить мне, как я могу оживить все эти объекты (на рисунке) и заставить их двигаться вперед? Я делаю что-то не так, принимая две разные фигуры в двух функциях анимации?
Мой фрагмент кода для функции анимации:
class collusionAnimation():
def initVehicle(self):
x_lim = np.array(axes.set_xlim(-30,30))
y_lim = np.array(axes.set_ylim(-30,30))
OrientRad = self.orient * 3.142 / 180
RotWidth_HalfX = ((self.vehicleWidth / 2) * math.cos( OrientRad )) - ((self.vehicleLength / 2) * math.sin( OrientRad ))
Rotheight_HalfY = ((self.vehicleLength / 2) * math.cos( OrientRad )) + ((self.vehicleWidth / 2) * math.sin( OrientRad ))
self.rect = plt.Rectangle( (self.InitPosX - RotWidth_HalfX , self.InitPosY - Rotheight_HalfY), self.vehicleWidth, self.vehicleLength, angle=self.orient, color='k', alpha=0.3 )
ax.add_patch(self.rect)
return self.rect,
def initTraj(self):
x_lim = np.array( axes.set_xlim( -30, 30 ) )
y_lim = np.array( axes.set_ylim( -30, 30 ) )
#self.InitPosX = 0
#self.InitPosY = 0
steer = []
steer = self.__steeringArcDraw( self.InitPosX, self.InitPosY )
return steer
def animateCollusion(self, i):
#self.rect.set_width( 1.2 )
#self.rect.set_height( 1.0 )
self.InitPosX = self.InitPosX + 0.5
self.InitPosY = self.InitPosY + 0.5
self.rect.set_xy([self.InitPosX, self.InitPosY])
ax.add_patch( self.rect )
return self.rect,
def animatetrajectory(self, i):
self.InitPosX = self.InitPosX + 0.5
self.InitPosY = self.InitPosY + 0.5
steer = self.__steeringArcDraw( self.InitPosX, self.InitPosY )
return steer
c1 = collusionAnimation(4,2,(0,0),-45,[90])
wm = plt.get_current_fig_manager()
wm.window.state('zoomed')
anim = animation.FuncAnimation(fig, c1.animateCollusion,init_func=c1.initVehicle,frames=50,interval=1000,blit=False,repeat=False)
animTraj = animation.FuncAnimation(fig, c1.animatetrajectory,init_func=c1.initTraj,frames=50,interval=1000, blit=True,repeat=False)
plt.show()
Здесь функция "__steeringArcDraw" др aws пучок дуг к прямоугольнику.
Решения пробовали:
У меня есть также пытался реализовать обе функции анимации в одном.
def initVehicle(self):
x_lim = np.array(axes.set_xlim(-30,30))
y_lim = np.array(axes.set_ylim(-30,30))
OrientRad = self.orient * 3.142 / 180
RotWidth_HalfX = ((self.vehicleWidth / 2) * math.cos( OrientRad )) - ((self.vehicleLength / 2) * math.sin( OrientRad ))
Rotheight_HalfY = ((self.vehicleLength / 2) * math.cos( OrientRad )) + ((self.vehicleWidth / 2) * math.sin( OrientRad ))
self.rect = plt.Rectangle( (self.InitPosX - RotWidth_HalfX , self.InitPosY - Rotheight_HalfY), self.vehicleWidth, self.vehicleLength, angle=self.orient, color='k', alpha=0.3 )
ax.add_patch(self.rect)
steer = self.__steeringArcDraw( self.InitPosX, self.InitPosY )
return self.rect, steer
def animateCollusion(self, i):
#self.rect.set_width( 1.2 )
#self.rect.set_height( 1.0 )
self.InitPosX = self.InitPosX + 0.5
self.InitPosY = self.InitPosY + 0.5
self.rect.set_xy([self.InitPosX, self.InitPosY])
ax.add_patch( self.rect )
steer =self.__steeringArcDraw(self.InitPosX, self.InitPosY)
return self.rect, steer
anim = animation.FuncAnimation(fig, c1.animateCollusion,init_func=c1.initVehicle,frames=50,interval=1000,blit=False,repeat=False)
plt.show()
Но я вижу только прогрессирующий прямоугольник для каждого кадра и никаких дуг вообще. Кроме того, это не работает, когда я заставляю Blit быть правдой. Поэтому я решил создать две анимированные функции, одну для движения прямоугольника, а другую для движения группы дуг.