pub struct RationalCurve<P: VectorSpace> { /* private fields */ }Expand description
A collection of RationalSegments chained into a single parametric curve. It is a Curve
with domain [0, N], where N is the number of segments.
Use any struct that implements the RationalGenerator trait to create a new curve, such as
CubicNurbs, or convert CubicCurve using into/from.
Implementations§
Source§impl<P: VectorSpace<Scalar = f32>> RationalCurve<P>
impl<P: VectorSpace<Scalar = f32>> RationalCurve<P>
Sourcepub fn from_segments(
segments: impl IntoIterator<Item = RationalSegment<P>>,
) -> Option<Self>
pub fn from_segments( segments: impl IntoIterator<Item = RationalSegment<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 curve at the parametric value t.
Note that t varies from 0 to self.length().
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 curve at t.
Note that t varies from 0 to self.length().
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 curve at t.
Note that t varies from 0 to self.length().
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) -> &[RationalSegment<P>]
pub fn segments(&self) -> &[RationalSegment<P>]
The list of segments contained in this RationalCurve.
This spline’s global t value is equal to how many segments it has.
All method accepting t on RationalCurve 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: RationalSegment<P>)
pub fn push_segment(&mut self, segment: RationalSegment<P>)
Adds a segment to the curve.
Trait Implementations§
Source§impl<P: Clone + VectorSpace> Clone for RationalCurve<P>
impl<P: Clone + VectorSpace> Clone for RationalCurve<P>
Source§fn clone(&self) -> RationalCurve<P>
fn clone(&self) -> RationalCurve<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 RationalCurve<P>
Available on crate feature alloc only.
impl<P: VectorSpace<Scalar = f32>> Curve<P> for RationalCurve<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 RationalCurve<P>
impl<P: Debug + VectorSpace> Debug for RationalCurve<P>
Source§impl<'de, P> Deserialize<'de> for RationalCurve<P>where
P: Deserialize<'de> + VectorSpace,
impl<'de, P> Deserialize<'de> for RationalCurve<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<RationalSegment<P>> for RationalCurve<P>
Available on crate feature alloc only.
impl<P: VectorSpace> Extend<RationalSegment<P>> for RationalCurve<P>
alloc only.Source§fn extend<T: IntoIterator<Item = RationalSegment<P>>>(&mut self, iter: T)
fn extend<T: IntoIterator<Item = RationalSegment<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 RationalCurve<P>
Available on crate feature alloc only.
impl<P: VectorSpace> IntoIterator for RationalCurve<P>
alloc only.Source§impl<P: PartialEq + VectorSpace> PartialEq for RationalCurve<P>
impl<P: PartialEq + VectorSpace> PartialEq for RationalCurve<P>
Source§impl<P: VectorSpace<Scalar = f32>> SampleDerivative<P> for RationalCurve<P>
Available on crate feature alloc only.
impl<P: VectorSpace<Scalar = f32>> SampleDerivative<P> for RationalCurve<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 RationalCurve<P>
Available on crate feature alloc only.
impl<P: VectorSpace<Scalar = f32>> SampleTwoDerivatives<P> for RationalCurve<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 RationalCurve<P>where
P: Serialize + VectorSpace,
impl<P> Serialize for RationalCurve<P>where
P: Serialize + VectorSpace,
impl<P: PartialEq + VectorSpace> StructuralPartialEq for RationalCurve<P>
Auto Trait Implementations§
impl<P> Freeze for RationalCurve<P>
impl<P> RefUnwindSafe for RationalCurve<P>where
P: RefUnwindSafe,
impl<P> Send for RationalCurve<P>where
P: Send,
impl<P> Sync for RationalCurve<P>where
P: Sync,
impl<P> Unpin for RationalCurve<P>where
P: Unpin,
impl<P> UnsafeUnpin for RationalCurve<P>
impl<P> UnwindSafe for RationalCurve<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.