pub struct CubicCurve<P: VectorSpace> { /* private fields */ }Expand description
A collection of CubicSegments chained into a single parametric curve. It is a Curve
with domain [0, N], where N is its number of segments.
Use any struct that implements the CubicGenerator trait to create a new curve, such as
CubicBezier.
Implementations§
Source§impl<P: VectorSpace<Scalar = f32>> CubicCurve<P>
impl<P: VectorSpace<Scalar = f32>> CubicCurve<P>
Sourcepub fn from_segments(
segments: impl IntoIterator<Item = CubicSegment<P>>,
) -> Option<Self>
pub fn from_segments( segments: impl IntoIterator<Item = CubicSegment<P>>, ) -> Option<Self>
Create a new curve from a collection of segments. If the collection of segments is empty,
a curve cannot be built and None will be returned instead.
Sourcepub fn position(&self, t: f32) -> P
pub fn position(&self, t: f32) -> P
Compute the position of a point on the cubic curve at the parametric value t.
Note that t varies from 0..=(n_points - 3).
Sourcepub fn velocity(&self, t: f32) -> P
pub fn velocity(&self, t: f32) -> P
Compute the first derivative with respect to t at t. This is the instantaneous velocity of
a point on the cubic curve at t.
Note that t varies from 0..=(n_points - 3).
Sourcepub fn acceleration(&self, t: f32) -> P
pub fn acceleration(&self, t: f32) -> P
Compute the second derivative with respect to t at t. This is the instantaneous
acceleration of a point on the cubic curve at t.
Note that t varies from 0..=(n_points - 3).
Sourcepub fn iter_samples<'a, 'b: 'a>(
&'b self,
subdivisions: usize,
sample_function: impl FnMut(&Self, f32) -> P + 'a,
) -> impl Iterator<Item = P> + 'a
pub fn iter_samples<'a, 'b: 'a>( &'b self, subdivisions: usize, sample_function: impl FnMut(&Self, f32) -> P + 'a, ) -> impl Iterator<Item = P> + 'a
A flexible iterator used to sample curves with arbitrary functions.
This splits the curve into subdivisions of evenly spaced t values across the
length of the curve from start (t = 0) to end (t = n), where n = self.segment_count(),
returning an iterator evaluating the curve with the supplied sample_function at each t.
For subdivisions = 2, this will split the curve into two lines, or three points, and
return an iterator with 3 items, the three points, one at the start, middle, and end.
Sourcepub fn segments(&self) -> &[CubicSegment<P>]
pub fn segments(&self) -> &[CubicSegment<P>]
The list of segments contained in this CubicCurve.
This spline’s global t value is equal to how many segments it has.
All method accepting t on CubicCurve depends on the global t.
When sampling over the entire curve, you should either use one of the
iter_* methods or account for the segment count using curve.segments().len().
Sourcepub fn iter_positions(
&self,
subdivisions: usize,
) -> impl Iterator<Item = P> + '_
pub fn iter_positions( &self, subdivisions: usize, ) -> impl Iterator<Item = P> + '_
Iterate over the curve split into subdivisions, sampling the position at each step.
Sourcepub fn iter_velocities(
&self,
subdivisions: usize,
) -> impl Iterator<Item = P> + '_
pub fn iter_velocities( &self, subdivisions: usize, ) -> impl Iterator<Item = P> + '_
Iterate over the curve split into subdivisions, sampling the velocity at each step.
Sourcepub fn iter_accelerations(
&self,
subdivisions: usize,
) -> impl Iterator<Item = P> + '_
pub fn iter_accelerations( &self, subdivisions: usize, ) -> impl Iterator<Item = P> + '_
Iterate over the curve split into subdivisions, sampling the acceleration at each step.
Sourcepub fn push_segment(&mut self, segment: CubicSegment<P>)
pub fn push_segment(&mut self, segment: CubicSegment<P>)
Adds a segment to the curve
Trait Implementations§
Source§impl<P: Clone + VectorSpace> Clone for CubicCurve<P>
impl<P: Clone + VectorSpace> Clone for CubicCurve<P>
Source§fn clone(&self) -> CubicCurve<P>
fn clone(&self) -> CubicCurve<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>> Curve<P> for CubicCurve<P>
Available on crate feature alloc only.
impl<P: VectorSpace<Scalar = f32>> Curve<P> for CubicCurve<P>
alloc only.Source§fn sample_unchecked(&self, t: f32) -> P
fn sample_unchecked(&self, t: f32) -> P
t, extracting the associated value.
This is the unchecked version of sampling, which should only be used if the sample time t
is already known to lie within the curve’s domain. Read moreSource§fn sample(&self, t: f32) -> Option<T>
fn sample(&self, t: f32) -> Option<T>
t, returning None if the point is
outside of the curve’s domain.Source§fn sample_clamped(&self, t: f32) -> T
fn sample_clamped(&self, t: f32) -> T
t, clamping t to lie inside the
domain of the curve.Source§impl<P: Debug + VectorSpace> Debug for CubicCurve<P>
impl<P: Debug + VectorSpace> Debug for CubicCurve<P>
Source§impl<'de, P> Deserialize<'de> for CubicCurve<P>where
P: Deserialize<'de> + VectorSpace,
impl<'de, P> Deserialize<'de> for CubicCurve<P>where
P: Deserialize<'de> + VectorSpace,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<P: VectorSpace> Extend<CubicSegment<P>> for CubicCurve<P>
Available on crate feature alloc only.
impl<P: VectorSpace> Extend<CubicSegment<P>> for CubicCurve<P>
alloc only.Source§fn extend<T: IntoIterator<Item = CubicSegment<P>>>(&mut self, iter: T)
fn extend<T: IntoIterator<Item = CubicSegment<P>>>(&mut self, iter: T)
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)Source§impl<P: VectorSpace> From<CubicCurve<P>> for RationalCurve<P>
Available on crate feature alloc only.
impl<P: VectorSpace> From<CubicCurve<P>> for RationalCurve<P>
alloc only.Source§fn from(value: CubicCurve<P>) -> Self
fn from(value: CubicCurve<P>) -> Self
Source§impl<P: VectorSpace> IntoIterator for CubicCurve<P>
Available on crate feature alloc only.
impl<P: VectorSpace> IntoIterator for CubicCurve<P>
alloc only.Source§impl<P: PartialEq + VectorSpace> PartialEq for CubicCurve<P>
impl<P: PartialEq + VectorSpace> PartialEq for CubicCurve<P>
Source§impl<P: VectorSpace<Scalar = f32>> SampleDerivative<P> for CubicCurve<P>
Available on crate feature alloc only.
impl<P: VectorSpace<Scalar = f32>> SampleDerivative<P> for CubicCurve<P>
alloc only.Source§fn sample_with_derivative_unchecked(&self, t: f32) -> WithDerivative<P>
fn sample_with_derivative_unchecked(&self, t: f32) -> WithDerivative<P>
t, extracting the associated value
in addition to its derivative. This is the unchecked version of sampling, which
should only be used if the sample time t is already known to lie within the
curve’s domain. Read moreSource§fn sample_with_derivative(&self, t: f32) -> Option<WithDerivative<T>>
fn sample_with_derivative(&self, t: f32) -> Option<WithDerivative<T>>
t, returning
None if the point is outside of the curve’s domain.Source§fn sample_with_derivative_clamped(&self, t: f32) -> WithDerivative<T>
fn sample_with_derivative_clamped(&self, t: f32) -> WithDerivative<T>
t, clamping t
to lie inside the domain of the curve.Source§impl<P: VectorSpace<Scalar = f32>> SampleTwoDerivatives<P> for CubicCurve<P>
Available on crate feature alloc only.
impl<P: VectorSpace<Scalar = f32>> SampleTwoDerivatives<P> for CubicCurve<P>
alloc only.Source§fn sample_with_two_derivatives_unchecked(&self, t: f32) -> WithTwoDerivatives<P>
fn sample_with_two_derivatives_unchecked(&self, t: f32) -> WithTwoDerivatives<P>
t, extracting the associated value
in addition to two derivatives. This is the unchecked version of sampling, which
should only be used if the sample time t is already known to lie within the
curve’s domain. Read moreSource§fn sample_with_two_derivatives(&self, t: f32) -> Option<WithTwoDerivatives<T>>
fn sample_with_two_derivatives(&self, t: f32) -> Option<WithTwoDerivatives<T>>
t, returning
None if the point is outside of the curve’s domain.Source§fn sample_with_two_derivatives_clamped(&self, t: f32) -> WithTwoDerivatives<T>
fn sample_with_two_derivatives_clamped(&self, t: f32) -> WithTwoDerivatives<T>
t, clamping t
to lie inside the domain of the curve.Source§impl<P> Serialize for CubicCurve<P>where
P: Serialize + VectorSpace,
impl<P> Serialize for CubicCurve<P>where
P: Serialize + VectorSpace,
impl<P: PartialEq + VectorSpace> StructuralPartialEq for CubicCurve<P>
Auto Trait Implementations§
impl<P> Freeze for CubicCurve<P>
impl<P> RefUnwindSafe for CubicCurve<P>where
P: RefUnwindSafe,
impl<P> Send for CubicCurve<P>where
P: Send,
impl<P> Sync for CubicCurve<P>where
P: Sync,
impl<P> Unpin for CubicCurve<P>where
P: Unpin,
impl<P> UnsafeUnpin for CubicCurve<P>
impl<P> UnwindSafe for CubicCurve<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<C, T> CurveExt<T> for Cwhere
C: Curve<T>,
impl<C, T> CurveExt<T> for Cwhere
C: Curve<T>,
Source§fn sample_iter(
&self,
iter: impl IntoIterator<Item = f32>,
) -> impl Iterator<Item = Option<T>>
fn sample_iter( &self, iter: impl IntoIterator<Item = f32>, ) -> impl Iterator<Item = Option<T>>
n >= 0 points on this curve at the parameter values t_n,
returning None if the point is outside of the curve’s domain. Read moreSource§fn sample_iter_unchecked(
&self,
iter: impl IntoIterator<Item = f32>,
) -> impl Iterator<Item = T>
fn sample_iter_unchecked( &self, iter: impl IntoIterator<Item = f32>, ) -> impl Iterator<Item = T>
n >= 0 points on this curve at the parameter values t_n,
extracting the associated values. This is the unchecked version of sampling, which should
only be used if the sample times t_n are already known to lie within the curve’s domain. Read moreSource§fn sample_iter_clamped(
&self,
iter: impl IntoIterator<Item = f32>,
) -> impl Iterator<Item = T>
fn sample_iter_clamped( &self, iter: impl IntoIterator<Item = f32>, ) -> impl Iterator<Item = T>
n >= 0 points on this curve at the parameter values t_n,
clamping t_n to lie inside the domain of the curve. Read moreSource§fn map<S, F>(self, f: F) -> MapCurve<T, S, Self, F>where
F: Fn(T) -> S,
fn map<S, F>(self, f: F) -> MapCurve<T, S, Self, F>where
F: Fn(T) -> S,
f; i.e., if the
sample at time t for this curve is x, the value at time t on the new curve will be
f(x).Source§fn reparametrize<F>(self, domain: Interval, f: F) -> ReparamCurve<T, Self, F>
fn reparametrize<F>(self, domain: Interval, f: F) -> ReparamCurve<T, Self, F>
Curve whose parameter space is related to the parameter space of this curve
by f. For each time t, the sample from the new curve at time t is the sample from
this curve at time f(t). The given domain will be the domain of the new curve. The
function f is expected to take domain into self.domain(). Read moreSource§fn reparametrize_linear(
self,
domain: Interval,
) -> Result<LinearReparamCurve<T, Self>, LinearReparamError>
fn reparametrize_linear( self, domain: Interval, ) -> Result<LinearReparamCurve<T, Self>, LinearReparamError>
Source§fn reparametrize_by_curve<C>(self, other: C) -> CurveReparamCurve<T, Self, C>
fn reparametrize_by_curve<C>(self, other: C) -> CurveReparamCurve<T, Self, C>
Source§fn graph(self) -> GraphCurve<T, Self>
fn graph(self) -> GraphCurve<T, Self>
Source§fn chain<C>(self, other: C) -> Result<ChainCurve<T, Self, C>, ChainError>where
C: Curve<T>,
fn chain<C>(self, other: C) -> Result<ChainCurve<T, Self, C>, ChainError>where
C: Curve<T>,
Source§fn reverse(self) -> Result<ReverseCurve<T, Self>, ReverseError>
fn reverse(self) -> Result<ReverseCurve<T, Self>, ReverseError>
Source§fn repeat(self, count: usize) -> Result<RepeatCurve<T, Self>, RepeatError>
fn repeat(self, count: usize) -> Result<RepeatCurve<T, Self>, RepeatError>
Source§fn forever(self) -> Result<ForeverCurve<T, Self>, RepeatError>
fn forever(self) -> Result<ForeverCurve<T, Self>, RepeatError>
Source§fn ping_pong(self) -> Result<PingPongCurve<T, Self>, PingPongError>
fn ping_pong(self) -> Result<PingPongCurve<T, Self>, PingPongError>
Source§fn chain_continue<C>(
self,
other: C,
) -> Result<ContinuationCurve<T, Self, C>, ChainError>where
T: VectorSpace,
C: Curve<T>,
fn chain_continue<C>(
self,
other: C,
) -> Result<ContinuationCurve<T, Self, C>, ChainError>where
T: VectorSpace,
C: Curve<T>,
Source§fn samples(
&self,
samples: usize,
) -> Result<impl Iterator<Item = T>, ResamplingError>
fn samples( &self, samples: usize, ) -> Result<impl Iterator<Item = T>, ResamplingError>
Source§impl<C, T> CurveResampleExt<T> for C
impl<C, T> CurveResampleExt<T> for C
Source§fn resample<I>(
&self,
segments: usize,
interpolation: I,
) -> Result<SampleCurve<T, I>, ResamplingError>
fn resample<I>( &self, segments: usize, interpolation: I, ) -> Result<SampleCurve<T, I>, ResamplingError>
Curve to produce a new one that is defined by interpolation over equally
spaced sample values, using the provided interpolation to interpolate between adjacent samples.
The curve is interpolated on segments segments between samples. For example, if segments is 1,
only the start and end points of the curve are used as samples; if segments is 2, a sample at
the midpoint is taken as well, and so on. Read moreSource§fn resample_auto(
&self,
segments: usize,
) -> Result<SampleAutoCurve<T>, ResamplingError>where
T: StableInterpolate,
fn resample_auto(
&self,
segments: usize,
) -> Result<SampleAutoCurve<T>, ResamplingError>where
T: StableInterpolate,
Curve to produce a new one that is defined by interpolation over equally
spaced sample values, using automatic interpolation to interpolate between adjacent samples.
The curve is interpolated on segments segments between samples. For example, if segments is 1,
only the start and end points of the curve are used as samples; if segments is 2, a sample at
the midpoint is taken as well, and so on. Read moreSource§fn resample_uneven<I>(
&self,
sample_times: impl IntoIterator<Item = f32>,
interpolation: I,
) -> Result<UnevenSampleCurve<T, I>, ResamplingError>
fn resample_uneven<I>( &self, sample_times: impl IntoIterator<Item = f32>, interpolation: I, ) -> Result<UnevenSampleCurve<T, I>, ResamplingError>
Source§fn resample_uneven_auto(
&self,
sample_times: impl IntoIterator<Item = f32>,
) -> Result<UnevenSampleAutoCurve<T>, ResamplingError>where
T: StableInterpolate,
fn resample_uneven_auto(
&self,
sample_times: impl IntoIterator<Item = f32>,
) -> Result<UnevenSampleAutoCurve<T>, ResamplingError>where
T: StableInterpolate,
Curve to produce a new one that is defined by automatic interpolation over
samples taken at the given set of times. The given sample_times are expected to contain at least
two valid times within the curve’s domain interval. Read moreSource§impl<T, C> CurveWithDerivative<T> for Cwhere
T: HasTangent,
C: SampleDerivative<T>,
impl<T, C> CurveWithDerivative<T> for Cwhere
T: HasTangent,
C: SampleDerivative<T>,
Source§fn with_derivative(self) -> SampleDerivativeWrapper<C>
fn with_derivative(self) -> SampleDerivativeWrapper<C>
Source§impl<T, C> CurveWithTwoDerivatives<T> for C
impl<T, C> CurveWithTwoDerivatives<T> for C
Source§fn with_two_derivatives(self) -> SampleTwoDerivativesWrapper<C>
fn with_two_derivatives(self) -> SampleTwoDerivativesWrapper<C>
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
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> Serialize for T
impl<T> Serialize for T
fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>
fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>
Source§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.