Library for manipulating 1D, 2D, and 3D splines. Functionality included:
- Creation from Bezier, Hermite, and Catmull-Rom forms
- Creation of an array of splines from an array of points and tension value, or Bezier hull points, or Hermite tangents.
- Creation of arcs and circles
- Evaluation of position, velocity, acceleration, curvature, torsion, and tangent frame
- Length measurement
- Finding bounds
- Offsetting (e.g., for stroking) and reversing splines
- Splitting and re-joining of single splines
- Subdivision of runs of splines either evenly, for flatness, or to be linear in arc length
- Conversion of runs of splines to line segments, e.g., for drawing
- Finding the closest point on a run of splines
- Finding where runs of splines intersect, or a run of splines self-intersects
- Helpers for advancing a point along a spline at some given velocity
- Support for monotonic splines, which don't extrapolate outside the source points
- Support for rotational splines in RotSplines.*, comprising of angle interpolation in 2D, and quaternion interpolation in 3D. Includes code for evaluation of rotational velocity and acceleration for both.
There is an interactive demo of some of this functionality.
As an example of a use case, there is also a test harness for a path system built on both the linear and rotational spline functionality here. This system is given a list of positions and times, and optionally speeds, directions, orientations and rotation speeds as constraints to hit.
To build and run a test app, make test, or, add the Splines* files to your
favourite IDE.
In extra there is some code for drawing various spline features (as per the
examples below and the demo). It's missing the draw and transform dependencies,
but could be useful as reference.
Splines from Points:
Fast and Conservative Bounds:
Closest Point on Spline:
Spline Intersections:
Moving Points on Splines:
Subdivision and Joining:





