### 7 releases

0.1.7 | Mar 19, 2023 |
---|---|

0.1.6 | Feb 23, 2023 |

0.1.5 | Nov 30, 2021 |

0.1.4 | Feb 11, 2021 |

0.1.1 | Oct 30, 2020 |

#**221** in Math

**61** downloads per month

**MIT OR Apache-2.0 OR Zlib**

26KB

318 lines

`uniform-cubic-splines`

`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

and `spline``(``)`

it is
possible to compute a full spline-with-nonuniform-abscissæ:`spline_inverse``(``)`

`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

-- The`monotonic_check`

code will check if the knot vector is monotonic. This check can be made a lot faster if the`spline_inverse``(``)`

feature is enabled.`unstable`

-- The`unstable`

feature will be faster but requite a`monotonic_check`

toolchain.`nightly`

-- The`use_std`

accelleration will be detected at runtime.`monotonic_check`

## 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

~180KB