using HermiteSpline
using StaticArrays
s = hermitespline(2)
push!(s, 0.0, @SVector([0.0, 0.0]), @SVector([0.0, +1.0]))
push!(s, 1.0, @SVector([1.0, 0.0]), @SVector([0.0, -1.0]))
length(s) # 2
isempty(s) # false
isascending(s) # true
rs = reverse(s)
@assert knots(rs) == reverse(knots(s))
isascending(rs) # false
# Enumerate control points
ts = knots(s) # may be generators or arrays
xs = collect(values(s))
dxs = collect(derivatives(s))
t t knot(s, 1)
t, x, dx = s[end]
t_x_dx == collect(s) # ::Vector{Tuple{...}}
ts, xs, dxs = s[1:end] # ::Tuple{Vector,...}
for (t, x, dx) in s
# ...
end
#
# Evaluate explicit (copy of) piece
p = HermiteSpline.piece(s, 0.5)
x = p(0.5)
x = p(0.5, Value)
x, dx = p(0.5, ValueDerivative)
# Evaluate spline
x = s(0.5)
x = s(0.5)
x, dx = s(0.5, ValueDerivative)
idx = 1 # point-location: cache index of knot interval
(x, dx), idx = s(0.5, ValueDerivative, idx)
x, idx = s(0.5, Value, idx)
xs = s(range(0.0, 1.0, length=10), Value)
xs = s([0.0, 0.5, 1.0], Value)
xs = s([0.0, 0.5, 1.0], Value; sorted=true)
xs = s(rand(10000), Value; sorted=false) # possibly faster ...
xs = s(rand(10000), Value; sorted=true) # ... than w/o presorting ts
# Concatenation
r = hermitespline(2)
push!(r, -1.0, @SVector([0.0, 0.0]), @SVector([0.0, +1.0]))
push!(r, 0.0, @SVector([1.0, 0.0]), @SVector([0.0, -1.0]))
h = vcat(r, s)
h2 = copy(r) # alternative
append!(h2, s)
# Visualization
using Plots
plot(h)