stroke 0.3.0

Zero-allocation, const-generic implementations of Bézier and B-Spline curves in N-dimensional euclidean space.
Documentation
use stroke::{Bezier, PointN, PointNorm};

fn main() {
    let curve = Bezier::<PointN<f64, 2>, 4>::new([
        PointN::new([0.0, 0.0]),
        PointN::new([1.0, 2.0]),
        PointN::new([3.0, -1.0]),
        PointN::new([4.0, 0.0]),
    ]);

    let steps = 6;
    let nsteps = 512;
    let total = curve.arclen(nsteps);
    println!("total length (approx): {:.5}", total);

    let mut prev: Option<PointN<f64, 2>> = None;
    for i in 0..steps {
        let s = total * (i as f64 / (steps - 1) as f64);
        let t = curve.t_at_length_approx(s, nsteps);
        let p = curve.point_at_length_approx(s, nsteps);
        let gap = prev.map(|q| (p - q).squared_norm().sqrt());
        match gap {
            Some(d) => println!("i={}  s={:.4}  t={:.4}  p={:?}  gap={:.4}", i, s, t, p, d),
            None => println!("i={}  s={:.4}  t={:.4}  p={:?}", i, s, t, p),
        }
        prev = Some(p);
    }
}