Cobweb plot



using AbstractPlotting

f(x::Real, r::Real) = r * x * (1 - x)
function cobweb(
        xᵢ::Real,
        curve_f::Function,
        r::Real;
        nstep::Real = 30
    )::Vector{Point2f0} # col 1 is x, col 2 is y

    a = zeros(nstep*2, 2)
    a[1, 1] = xᵢ
    x = xᵢ
    y = curve_f(x, r)
    ret = similar(Vector{Point2f0}, nstep*2)

    for i  2:2:nstep*2-2
        a[i, 1] = x
        a[i, 2] = y
        x = y
        y = curve_f(x, r)
        a[i+1, 1] = x
        a[i+1, 2] = x
        ret[i] = Point2f0(a[i, 1], a[i, 2])
        ret[i+1] = Point2f0(a[i+1, 1], a[i+1, 2])
    end

    return ret

end

xᵢ = 0.1
rᵢ = 2.8
xr = 0:0.001:1
## setup sliders
sx, x = textslider(0:0.01:1, "xᵢ", start = xᵢ)
sr, r = textslider(0:0.01:4, "r", start = rᵢ)
## setup lifts
fs = lift(r -> f.(xr, r), r)
cw = lift((x, r) -> cobweb(x, f, r), x, r)
## setup plots
sc = lines(               # plot x=y, the bisector line
    xr,                   # xs
    xr,                   # ys
    linestyle = :dash,    # style of line
    linewidth = 3,        # width of line
    color = :blue         # colour of line
)

sc[Axis][:names][:axisnames] = ("x(t)", "x(t+1)") # set axis names

lines!(sc, xr, fs) # plot the curve

lines!(sc, cw) # plot the cobweb

final = hbox(sc, vbox(sx, sr))

record(final, "output.mp4", range(0.01, stop = 5, length = 100)) do i
    r[] = i
end