Как сделать анимацию движения объекта по кривой (алгоритм Безье)

Вот что имею на данный момент, вроде всё хорошо работает, но хотелось бы комментарий к каждой строке кода, а также, как убрать маркер и вместо него заставить двигаться эллипс, диаметр, длину ширину, которого, можно будет менять.

from matplotlib import pyplot as plt
from celluloid import Camera
import numpy as np
 
tau=np.linspace(0,1,1000)
P=np.array([[180, 290],
           [140, 335],
           [50,  170],
           [10,   15],
           [360, 240],
           [140,  67]
           ])
 
def Bezier(t, P):
    # Bezier Matrix:
    Mb=np.matrix([
        [ -1,   5, -10,  10, -5, 1],
        [  5, -20,  30, -20,  5, 0],
        [-10,  30, -30,  10,  0, 0],
        [ 10, -20,  10,   0,  0, 0],
        [ -5,   5,   0,   0,  0, 0],
        [  1,   0,   0,   0,  0, 0]
                 ])
    # T matrix
    xx, yy=np.meshgrid(np.arange(5, -1, -1), t)
    xx=np.matrix(xx)
    yy=np.matrix(yy)
    T_mat=np.power(yy, xx)
    B=T_mat*Mb*P
    return B
%matplotlib qt5
fig = plt.figure()
plt.xlim(0,600)
plt.ylim(0,600)
X,Y=Bezier(tau, P)[:,0],Bezier(tau, P)[:,1]
camera = Camera(fig)
 
for i in range(100):
    coord=Bezier(i/100, P)
    plt.plot(X,Y,color = '#ff0000')
    plt.scatter(coord[0,0], coord[0,1], color = '#00ff00' , marker='o')
    camera.snap()
    
animation = camera.animate(interval = 200, repeat = True,
                           repeat_delay = 500)

введите сюда описание изображения

tau это одномерный массив состоящий из 1000 элементов от 0 до 1?

P это двумерный массив, где хранятся координаты x,y моих контрольных точек.

Mb это двумерный массив, где хранятся коэффициенты при t, Затем создаём прямоугольную сетку используя одномерные массивы xx и yy (от -5 до -1 с шагом -1), и зачем нужен параметр t здесь? не понял 25 строку.

xx = матрица размерностью хх

yy = матрица размерностью yy

( T_mat=np.power(yy, xx)) снова не понял, но это возведение элемента массива yy в степень элемента массива xx?

Затем создаём объект figure без осей

Затем устанавливаем пределы x и y осей

(X,Y=Bezier(tau, P)[:,0],Bezier(tau, P)[:,1]) не понял что происходит, но что-то присваивается переменным x и y

Затем в цикле получаем координаты точек, отображаем их на графике красным цветом Добавляем маркер зелёного цвета (что значит coord[0,0], coord[0,1]?)

Затем снимок камеры

После того, как все кадры были получены, создаём анимацию?


Ответы (1 шт):

Автор решения: passant

Анимированные графики на Python создаются с помощью функции FuncAnimation из модуля animation библиотеки matplotlib.

Документация: https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.animation.FuncAnimation.html

Примеры: https://matplotlib.org/2.0.2/examples/animation/simple_anim.html

Тюториал: https://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/

→ Ссылка