Сообщество Engee

Анимация пружины

Автор
avatar-artpgchartpgch
Notebook
3D-модель затухающих колебаний пружины

Импортируем пакет Plots и активируем plotlyjs:

Pkg.add("Plots")
using Plots
plotlyjs()

Инициализируем параметры пружины:

dur = 2 # продолжительность анимации
fps = 10 # кадры в секунду
r = 5 # радиус пружины
a, b = 1, 1 # параметры геометрии витков
n = 8 # количество витков
pstart, pend = 0.35, 0.64 # начальное и конечное положение пружины
k = 0.01 # коэффициент затухания
freq = 1.2 # частота колебаний

Создадим функцию построения 3D-модели пружины:

# функция построения 3D-модели
function SpringModel(r, a, b, p, n)
    th = LinRange(0, 2π, 36)
    ph = LinRange(0, n*2π, 36*n)
    Ph = repeat(ph', length(th), 1)
    Th = repeat(th, 1, length(ph))
    X = (r .+ a .* cos.(Th)) .* cos.(Ph)
    Y = (r .+ b .* cos.(Th)) .* sin.(Ph)
    Z = a .* sin.(Th) .+ p .* Ph
    return X, Y, Z
end

Выполним анимацию, применяя экспоненциальное затухание:

anim = @animate for dt in 1:dur*fps
P = ((pend - pstart) * exp(-k*dt) * cos(2π * dt * freq / fps) + pstart + pend) / 2
X, Y, Z = SpringModel(r, a, b, P, n)
surface(X, Y, Z; opacity=0.7, color=:jet, shading=:interp, xlabel="", ylabel="", zlabel="", title="Пружина", legend=false, aspect_ratio=:equal, background_color=:white, framestyle=:none)
end
gif(anim, "Пружина.gif", fps = fps)

pruzhina.gif

Анимация отображает плавное затухание пружины.