Как анимировать полигон (определенный массивами) с помощью Python & Matplotlib - PullRequest
0 голосов
/ 30 октября 2018

Добрый день!

Объяснение проблемы: Я хочу анимировать полигон, значения которого я получаю из массива (в моем простом примере это движущийся квадрат). Я хочу, чтобы значения х и у полигона были изменяемыми. Не беспокойтесь о том, что делает полигон. Это всего лишь пример. Требуется работа с "set_xy ()", как в решении из анимации ' для перевода полигона с использованием matplotlib '.

Цель -> в каждом кадре анимации я хочу загрузить значения Polygon из массивов (P1x, P1y, P2x, P2y, ...) и обновить рисунок.

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

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
import matplotlib.patches as patches

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim(-10,10)
ax.set_ylim(-10,10)

P1x=[0.0,0.5,1.0,1.5,2.0,2.5,3.0]
P1y=[0.0,0.0,0.0,0.0,0.0,0.0,0.0]
P2x=[1.0,1.5,2.0,2.5,3.0,3.5,4.0]
P2y=[0.0,0.0,0.0,0.0,0.0,0.0,0.0]
P3x=[1.0,1.5,2.0,2.5,3.0,3.5,4.0]
P3y=[1.0,1.0,1.0,1.0,1.0,1.0,1.0]
P4x=[0.0,0.5,1.0,1.5,2.0,2.5,3.0]
P4y=[1.0,1.0,1.0,1.0,1.0,1.0,1.0]

def init():
    return patch,

def animate(i):
    v = np.array([
                [P1x[i],  P1y[i]],  
                [P2x[i],  P2y[i]],  
                [P3x[i],  P3y[i]],
                [P4x[i],  P4y[i]]
                ])
    patch=patches.Polygon(v,closed=True, fc='r', ec='r')

    return patch,

ani = animation.FuncAnimation(fig, animate, np.arange(1, 5), init_func=init,
                              interval=1000, blit=True)
plt.show()

Большое спасибо за вашу помощь!

1 Ответ

0 голосов
/ 30 октября 2018

Да, вам нужно сначала создать полигон и добавить его к осям. Внутри функции анимации вы можете использовать метод patch.set_xy() патча для обновления вершин многоугольника.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
import matplotlib.patches as patches

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim(-10,10)
ax.set_ylim(-10,10)

P1x=[0.0,0.5,1.0,1.5,2.0,2.5,3.0]
P1y=[0.0,0.0,0.0,0.0,0.0,0.0,0.0]
P2x=[1.0,1.5,2.0,2.5,3.0,3.5,4.0]
P2y=[0.0,0.0,0.0,0.0,0.0,0.0,0.0]
P3x=[1.0,1.5,2.0,2.5,3.0,3.5,4.0]
P3y=[1.0,1.0,1.0,1.0,1.0,1.0,1.0]
P4x=[0.0,0.5,1.0,1.5,2.0,2.5,3.0]
P4y=[1.0,1.0,1.0,1.0,1.0,1.0,1.0]

P = np.concatenate((np.array([P1x, P2x, P3x, P4x]).reshape(4,1,len(P1x)),
                    np.array([P1y, P2y, P3y, P4y]).reshape(4,1,len(P1x))), axis=1)

patch = patches.Polygon(P[:,:,0],closed=True, fc='r', ec='r')
ax.add_patch(patch)

def init():
    return patch,

def animate(i):
    patch.set_xy(P[:,:,i])
    return patch,

ani = animation.FuncAnimation(fig, animate, np.arange(P.shape[2]), init_func=init,
                              interval=1000, blit=True)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...