function animate(sol::Solution, args, name_part::String; framerate::Int64=10) println("Generating animation...") set_theme!(theme_black()) fig = Figure(; resolution=(1080, 1080)) ax = Axis( fig[1, 1]; limits=(-args.l, args.l, -args.l, args.l), aspect=AxisAspect(1), xlabel=L"x", ylabel=L"y", ) Colorbar( fig[1, 2]; limits=(0, 2), colormap=ColorSchemes.rainbow, label=L"\frac{\varphi}{\pi}", ) animation_path = "exports/$name_part.mkv" record(fig, animation_path; framerate=framerate) do io circles = Observable(Vector{Circle}(undef, args.N)) colors = Observable(Vector{RGBAf}(undef, args.N)) if args.debug segments_x = zeros(2 * args.N) segments_y = zeros(2 * args.N) interaction_circles = Vector{Circle}(undef, args.N) skin_circles = Vector{Circle}(undef, args.N) interaction_colors = Vector{RGBAf}(undef, args.N) skin_colors = Vector{RGBAf}(undef, args.N) end @showprogress 0.5 for frame in 1:(args.n_frames) @simd for i in 1:(args.N) circles[][i] = Circle( Point2(sol.center[i, frame]), args.particle_diameter / 2 ) color = get( ColorSchemes.rainbow, rem2pi(sol.φ[i, frame] / (2 * π), RoundDown) ) colors[][i] = RGBAf(color) if args.debug interaction_circles[i] = Circle( Point2(sol.center[i, frame]), args.interaction_r ) skin_circles[i] = Circle(Point2(sol.center[i, frame]), args.skin_r) interaction_colors[i] = RGBAf(color, 0.12) skin_colors[i] = RGBAf(color, 0.06) end end if frame > 1 if args.debug @simd for i in 1:(args.N) segments_x[2 * i - 1] = sol.center[i, frame - 1][1] segments_x[2 * i] = sol.center[i, frame][1] segments_y[2 * i - 1] = sol.center[i, frame - 1][2] segments_y[2 * i] = sol.center[i, frame][2] end if frame == 2 linesegments!(ax, segments_x, segments_y; color=colors) end end else # First frame poly!(ax, circles; color=colors) if args.debug poly!(ax, interaction_circles; color=interaction_colors) poly!(ax, skin_circles; color=skin_colors) end println("Started recording!") end notify(circles) notify(colors) ax.title = "t = $(round(sol.t[frame], digits=3))" recordframe!(io) end end println("Animation done and saved to $animation_path.") return nothing end