8 releases
0.1.8 | Oct 15, 2023 |
---|---|
0.1.7 | Mar 19, 2023 |
0.1.6 | Feb 23, 2023 |
0.1.5 | Nov 30, 2021 |
0.1.1 | Oct 30, 2020 |
#199 in Math
49 downloads per month
26KB
318 lines
uniform-cubic-splines
Uniform cubic spline interpolation & inversion.
This crate supports the following types of splines:
- B-spline
- Bezier
- Catmull-Rom
- Hermite
- Linear
- Power
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
-- Thespline_inverse()
code will check if the knot vector is monotonic. This check can be made a lot faster if theunstable
feature is enabled.unstable
-- Themonotonic_check
feature will be faster but requires anightly
toolchain.std
-- Themonotonic_check
accelleration will be detected at runtime.
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
~185KB