Документация Engee

Анимация

Создание анимации происходит в три этапа.

  • Инициализация объекта Animation.

  • Сохранение каждого кадра анимации с помощью frame(anim).

  • Преобразование кадров анимации в анимированный GIF-файл с помощью gif(anim, filename, fps=15).

Вспомогательные макросы @gif и @animate позволяют значительно упростить этот код. Примеры короткой версии см. на домашней странице, для длинной версии см. link:@ref gr_demo_2[пример gr].


Вспомогательные макросы

Для разных уровней удобства создания анимации доступны два макроса: @animate и @gif. Основное отличие заключается в том, что @animate возвращает объект Animation для последующей обработки, а @gif создает анимированный GIF-файл (и отображает его при возврате в ячейку IJulia).

Используйте @gif для простых одноразовых анимаций, которые нужно просмотреть немедленно. Для более сложных анимаций используйте @animate. Конструировать объекты Animation можно в тех случаях, когда необходим полный контроль жизненного цикла анимации (обычно это не требуется).

Примеры:

using Plots

@userplot CirclePlot
@recipe function f(cp::CirclePlot)
    x, y, i = cp.args
    n = length(x)
    inds = circshift(1:n, 1 - i)
    linewidth --> range(0, 10, length = n)
    seriesalpha --> range(0, 1, length = n)
    aspect_ratio --> 1
    label --> false
    x[inds], y[inds]
end

n = 150
t = range(0, 2π, length = n)
x = sin.(t)
y = cos.(t)

anim = @animate for i ∈ 1:n
    circleplot(x, y, i)
end
gif(anim, "anim_fps15.gif", fps = 15)
animations1
gif(anim, "anim_fps30.gif", fps = 30)
animations2

Флаг every будет сохранять кадр только «каждые N итераций»:

@gif for i ∈ 1:n
    circleplot(x, y, i, line_z = 1:n, cbar = false, framestyle = :zerolines)
end every 5
animations3

Флаг when будет сохранять кадр, только «когда выражение верно (true)».

n = 400
t = range(0, 2π, length = n)
x = 16sin.(t).^3
y = 13cos.(t) .- 5cos.(2t) .- 2cos.(3t) .- cos.(4t)

@gif for i ∈ 1:n
    circleplot(x, y, i, line_z = 1:n, cbar = false, c = :reds, framestyle = :none)
end when i > 40 && mod1(i, 10) == 5
animations4