Как можно анимировать функцию, изменяющуюся во времени, с помощью диаграммы Маки?

Я пытался построить простую функцию:

v(x, y) = (y*t, 2*x*t)

(фактическая реализация: v(x::Point2{T}, t) where T = Point2{T}(one(T) * x[2] * t, 4 * x[1]))

используя функцию 2D потокового графика Маки.

Хотя я могу построить каждый временной шаг отдельно, создав анонимную функцию f = x -> v(x, 5e0) (например) и построив график f, когда я попытаюсь обернуть его в Observable (используя Node(f)), я больше не смогу обновлять этот Observable, чтобы он указывал на другую функцию, поэтому мой цикл записи терпит неудачу.

Я попытался сделать тип узла более абстрактным (Node{Function}). К сожалению, этот абстрактный тип, кажется, затерялся где-то во внутренностях Маки и, таким образом, потерян.

Есть ли способ обернуть свой тип, чтобы не столкнуться с конфликтами типов, но при этом оставаться функцией?


person Anshul Singhvi    schedule 15.09.2019    source источник


Ответы (1)


Итак, оказывается, что есть прекрасный базовый метод Fix2(function, argument), который в основном решает мою проблему (поскольку он возвращает обернутый тип).

Рассмотрим этот пример функции:

v(x::Point2{T}, t) where T = Point2{T}(one(T) * x[2] * t, 4 * x[1])

Можно создать вызываемую функцию со временем, равным 1.0, следующим образом:

fixedfunc = Base.Fix2(v, 1.0)

который затем можно загрузить в Observable и обновить, чтобы получить новое значение времени без проблем.

Вот окончательный код для справки:

v(x::Point2{T}, t) where T = Point2{T}(one(T) * x[2] * t, 4 * x[1])
sf = Node(Base.Fix2(v, 0e0))

title_str = Node("t = 0.00")

sp = streamplot(
        sf,
        -2..2, -2..2;
        linewidth = 2,
        padding = (0, 0),
        arrow_size = 0.09,
        colormap =:magma
    )

sc = title(sp, title_str)

record(sc, "test.mp4", LinRange(0, 20, 5*30)) do i
  sf[] = Base.Fix2(v, i)
  title_str[] = "t = $(round(i; sigdigits = 2))"
end

видео

person Anshul Singhvi    schedule 15.09.2019
comment
Вау, весь этот пакет makie.jl выглядит довольно здорово :)! - person logankilpatrick; 15.09.2019