анимация matplotlib для синхронного перемещения нескольких фигур в одной фигуре - PullRequest
0 голосов
/ 11 марта 2020

Я должен оживить два объекта вместе как единое целое. Один объект - это прямоугольник, а другой объект - это множество дуг, которые образуют фонтан, начиная с центральной точки прямоугольника. Я создал функцию для построения дуг через центр прямоугольника, как показано на рисунке. A rectangle with many arcs

Описание проблемы: Я хочу анимировать это объединенное изображение (прямоугольник + связка дуг вместе) и заставить его выглядеть прогрессирующим вперед на каждый шаг по времени. Для этого я создал функцию с 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 быть правдой. Поэтому я решил создать две анимированные функции, одну для движения прямоугольника, а другую для движения группы дуг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...