#cubic-spline #spline-interpolation #spline #curve #cubic #graphics #inversion

no-std uniform-cubic-splines

Simple uniform cubic spline evaluation and inversion

11 releases

new 0.2.0 Mar 12, 2025
0.1.10 Sep 15, 2024
0.1.9 Aug 19, 2024
0.1.8 Oct 15, 2023
0.1.3 Nov 14, 2020

#218 in Math

Download history 8/week @ 2024-11-19 9/week @ 2024-11-26 38/week @ 2024-12-03 70/week @ 2024-12-10 18/week @ 2024-12-17 6/week @ 2024-12-31 5/week @ 2025-01-07 1/week @ 2025-01-14 29/week @ 2025-01-21 1/week @ 2025-01-28 38/week @ 2025-02-04 28/week @ 2025-02-11 26/week @ 2025-02-18 10/week @ 2025-02-25 37/week @ 2025-03-04

110 downloads per month
Used in 2 crates (via sl-map-apis)

MIT OR Apache-2.0 OR Zlib

26KB
316 lines

uniform-cubic-splines

Uniform cubic spline interpolation & inversion.

Documentation Crate

This crate supports the following types of splines:

Curve widget with 1D Catmull-Rom spline

Curve widget with a 1D Catmull-Rom spline with non-uniform knot spacing and knot multiplicity using this crate for interpolation (drawn using tiny-skia).

The crate uses generics to allow interpolation of any type for which certain traits are defined.

I.e. you can use this crate to interpolate splines in 1D, 2D, 3D, etc.

[dependencies]
uniform-cubic-splines = { version = "0.1" }

Example

Using a combination of spline() and spline_inverse() it is possible to compute a full spline-with-nonuniform-abscissæ:

use uniform_cubic_splines::{
    basis::CatmullRom, spline_inverse, spline,
};

// We want to evaluate the spline at knot value 0.3.
let x = 0.3;

// The first and last points are never interpolated.
let knot_spacing = [0.0, 0.0, 0.1, 0.3, 1.0, 1.0];
let knots        = [0.0, 0.0, 1.3, 4.2, 3.2, 3.2];

let v = spline_inverse::<CatmullRom, _>(x, &knot_spacing, None, None).unwrap();
let y = spline::<CatmullRom, _, _>(v, &knots);

assert!(y - 4.2 < 1e-6);

Features

  • monotonic_check -- The spline_inverse() code will check if the knot vector is monotonic (on by default).

Background

The code is a Rust port of the implementation found in the Open Shading Language C++ source.

If you come from a background of computer graphics/shading languages used in offline rendering this crate should feel like home.

Dependencies

~165KB