Как использовать FuncAnimation для анимации последовательности точек / кортежей в сетке - PullRequest
0 голосов
/ 29 мая 2020

Делаю реализацию алгоритма поиска пути в python, у меня есть сетка и полученный путь. Итак, я хочу использовать FuncAnimation для анимации последовательности точек от начала до цели в сетке. Я пытаюсь закодировать это, но это не дает мне линии. Это то, что я сделал. В этом примере кода я даю сетку и путь (позиции x, y в сетке), но на выходе получается просто сетка без пути, я не знаю, что делать, чтобы исправить проблему. , помогите пожалуйста!

import numpy as np

import matplotlib.pyplot as plt

from matplotlib.animation import FuncAnimation


def mazeanimation(grid, route):

        fig, ax = plt.subplots(figsize=(10,10))

        ax.imshow(grid, cmap=plt.cm.terrain)

        line, = ax.plot([],[], color="black")

        def init():
            line.set_data([],[])
            return line,

        def animate(i):
            x = route[i][0]

            y = route[i][1]

            line.set_data(x, y)
            return line,

        FuncAnimation(fig, animate, init_func=init,
                               frames=100, interval=20, blit=True) 


grid = np.array([

        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])

route = [(13, 1), (12, 2), (11, 3), (10, 4), (9, 5), (8, 5),
         (7, 5), (6, 5), (5, 5), (4, 5), (3, 5), (2, 6), (2, 7), 
         (2, 8), (2, 9), (2, 10), (2, 11), (2, 12), (2, 13), 
         (2, 14), (3, 15)]

mazeanimation(grid, route)

1 Ответ

0 голосов
/ 30 мая 2020

Вы можете добиться этого, используя интерактивный режим matplotlib:

import numpy as np
import matplotlib.pyplot as plt

#inputs###
grid = np.array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
        [1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])

route = [(13, 1), (12, 2), (11, 3), (10, 4), (9, 5), (8, 5),
         (7, 5), (6, 5), (5, 5), (4, 5), (3, 5), (2, 6), (2, 7), 
         (2, 8), (2, 9), (2, 10), (2, 11), (2, 12), (2, 13), 
         (2, 14), (3, 15)]
#setup the plot
fig, ax = plt.subplots(figsize=(10,10))
ax.imshow(grid, cmap=plt.cm.terrain)
line, = ax.plot([],[], color="black")

##### set interactive mode####
plt.ion()   
plt.show()


for i,j in route:
#set up the canvas
    plt.gcf().canvas.draw()
    line, = ax.plot(i,j,'.',c='black')
    plt.pause(0.1)

Вот как выглядит маршрут:

route

Альтернативно, с FuncAnimation :

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], '.',c='black')

def init():
    ax.imshow(grid, cmap=plt.cm.terrain)
    return ln,

def update(frame):
    xdata.append(frame[0])
    ydata.append(frame[1])
    ln.set_data(xdata, ydata)
    return ln,

ani = FuncAnimation(fig, update, frames=route,init_func=init, blit=True)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...