pub struct CubicCardinalSpline<P: VectorSpace> {
pub tension: f32,
pub control_points: Vec<P>,
}Expand description
A spline interpolated continuously across the nearest four control points, with the position of
the curve specified at every control point and the tangents computed automatically. The associated CubicCurve
has one segment between each pair of adjacent control points.
Note the Catmull-Rom spline is a special case of Cardinal spline where the tension is 0.5.
§Interpolation
The curve passes through every control point.
§Tangency
Tangents are automatically computed based on the positions of control points.
§Continuity
The curve is at minimum C1, meaning that it is continuous (it has no holes or jumps), and its tangent vector is also well-defined everywhere, without sudden jumps.
§Parametrization
The first segment of the curve connects the first two control points, the second connects the second and
third, and so on. This remains true when a cyclic curve is formed with to_curve_cyclic, in which case
the final curve segment connects the last control point to the first.
§Usage
let points = [
vec2(-1.0, -20.0),
vec2(3.0, 2.0),
vec2(5.0, 3.0),
vec2(9.0, 8.0),
];
let cardinal = CubicCardinalSpline::new(0.3, points).to_curve().unwrap();
let positions: Vec<_> = cardinal.iter_positions(100).collect();Fields§
§tension: f32Tension
control_points: Vec<P>The control points of the Cardinal spline
Implementations§
Source§impl<P: VectorSpace> CubicCardinalSpline<P>
impl<P: VectorSpace> CubicCardinalSpline<P>
Sourcepub fn new(tension: f32, control_points: impl IntoIterator<Item = P>) -> Self
pub fn new(tension: f32, control_points: impl IntoIterator<Item = P>) -> Self
Build a new Cardinal spline.
Sourcepub fn new_catmull_rom(control_points: impl IntoIterator<Item = P>) -> Self
pub fn new_catmull_rom(control_points: impl IntoIterator<Item = P>) -> Self
Build a new Catmull-Rom spline, the special case of a Cardinal spline where tension = 1/2.
Trait Implementations§
Source§impl<P: Clone + VectorSpace> Clone for CubicCardinalSpline<P>
impl<P: Clone + VectorSpace> Clone for CubicCardinalSpline<P>
Source§fn clone(&self) -> CubicCardinalSpline<P>
fn clone(&self) -> CubicCardinalSpline<P>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<P: VectorSpace<Scalar = f32>> CubicGenerator<P> for CubicCardinalSpline<P>
Available on crate feature alloc only.
impl<P: VectorSpace<Scalar = f32>> CubicGenerator<P> for CubicCardinalSpline<P>
alloc only.Source§type Error = InsufficientDataError
type Error = InsufficientDataError
Source§fn to_curve(&self) -> Result<CubicCurve<P>, Self::Error>
fn to_curve(&self) -> Result<CubicCurve<P>, Self::Error>
CubicCurve by computing the interpolation coefficients for each curve segment.Source§impl<P: VectorSpace<Scalar = f32>> CyclicCubicGenerator<P> for CubicCardinalSpline<P>
Available on crate feature alloc only.
impl<P: VectorSpace<Scalar = f32>> CyclicCubicGenerator<P> for CubicCardinalSpline<P>
alloc only.Source§type Error = InsufficientDataError
type Error = InsufficientDataError
Source§fn to_curve_cyclic(&self) -> Result<CubicCurve<P>, Self::Error>
fn to_curve_cyclic(&self) -> Result<CubicCurve<P>, Self::Error>
CubicCurve by computing the interpolation coefficients for each curve segment,
treating the control data as cyclic so that the result is a closed curve.Auto Trait Implementations§
impl<P> Freeze for CubicCardinalSpline<P>
impl<P> RefUnwindSafe for CubicCardinalSpline<P>where
P: RefUnwindSafe,
impl<P> Send for CubicCardinalSpline<P>where
P: Send,
impl<P> Sync for CubicCardinalSpline<P>where
P: Sync,
impl<P> Unpin for CubicCardinalSpline<P>where
P: Unpin,
impl<P> UnsafeUnpin for CubicCardinalSpline<P>
impl<P> UnwindSafe for CubicCardinalSpline<P>where
P: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> TypeData for T
impl<T> TypeData for T
Source§fn clone_type_data(&self) -> Box<dyn TypeData>
fn clone_type_data(&self) -> Box<dyn TypeData>
self.