Curve

Struct Curve 

Source
pub struct Curve<T>
where T: Clone + Curved + CurvedChange,
{ /* private fields */ }
Expand description

Interpolated Bezier Curve.

It’s made out of points:

  • P0 - starting point (from).
  • P1 - starting tangent point (from param).
  • P2 - ending tangent point (to param).
  • P3 - ending point (to).

It’s solved by interpolating each layer of it’s points instead of using Bezier equation:

  • A := lerp(from, from param, factor)
  • B := lerp(from param, to param, factor)
  • C := lerp(to param, to, factor)
  • D := lerp(A, B, factor)
  • E := lerp(B, C, factor)
  • Result: lerp(D, E, factor)

Implementations§

Source§

impl<T> Curve<T>
where T: Clone + Curved + CurvedChange,

Source

pub fn linear(from: T, to: T) -> Result<Self, CurveError>

Builds linear curve with from same as from_param and to same as to_param.

Source

pub fn bezier( from: T, from_param: T, to_param: T, to: T, ) -> Result<Self, CurveError>

Builds curve from all Bezier params.

Source

pub fn from(&self) -> &T

Gets starting point.

Source

pub fn set_from(&mut self, value: T)

Sets starting point.

Source

pub fn from_param(&self) -> &T

Gets starting tangent point.

Source

pub fn set_from_param(&mut self, value: T)

Sets starting tangent point.

Source

pub fn to_param(&self) -> &T

Gets ending tangent point.

Source

pub fn set_to_param(&mut self, value: T)

Sets ending tangent point.

Source

pub fn to(&self) -> &T

Gets ending point.

Source

pub fn set_to(&mut self, value: T)

Sets ending point.

Source

pub fn set(&mut self, from: T, from_param: T, to_param: T, to: T)

Sets all Bezier curve parameters.

Source

pub fn length(&self) -> Scalar

Gets arc length of this curve.

Source

pub fn aabb(&self) -> (&T, &T)

AABB of this curve. Returns tuple of min-max pair.

Source

pub fn category(&self) -> CurveCategory

Returns category of this curve.

Source

pub fn reverse(&self) -> Result<Self, CurveError>

Reverses curve, so: F, FP, TP, T -> T, TP, FP, F

Source

pub fn to_planar( &self, plane_origin: &T, plane_normal: &T, ) -> Result<Self, CurveError>

Projects this curve onto plane defined by origin and normal.

Source

pub fn shift( &self, distance: Scalar, guide: Option<&T>, ) -> Result<Self, CurveError>

Shifts this curve by distance perpendicular to guide. Produces low precision shift, so use it carefully! If you need high precision, use offset function.

Source

pub fn offset( &self, distance: Scalar, guide: Option<&T>, ) -> Result<Vec<Self>, CurveError>

Offsets this curve by distance. This produces high precision offsetted series of safe curves to ensure curves follow original shape as closely as possible.

Source

pub fn build_safe_curves(&self, out_result: &mut Vec<Self>)

Builds safe curves out of this curve. Safe curve means curve has at most one extremity and extremity is within circle between curve start and end points. Original curve is split at points of extremities until all sub-curves are considered safe.

Source

pub fn value_along_axis_iter( &self, steps: usize, axis_index: usize, ) -> Option<impl Iterator<Item = Scalar>>

Samples values along given axis in given number of steps.

Source

pub fn sample(&self, factor: Scalar) -> T

Samples curve at given factor in <0; 1> range.

Source

pub fn sample_along_axis( &self, axis_value: Scalar, axis_index: usize, ) -> Option<T>

Samples curve at value of given axis.

Source

pub fn sample_first_derivative(&self, factor: Scalar) -> T

Samples velocity of change along the curve.

Source

pub fn sample_first_derivative_along_axis( &self, axis_value: Scalar, axis_index: usize, ) -> Option<T>

Samples velocity of change along the curve axis.

Source

pub fn sample_second_derivative(&self, factor: Scalar) -> T

Samples acceleration of change along the curve.

Source

pub fn sample_second_derivative_along_axis( &self, axis_value: Scalar, axis_index: usize, ) -> Option<T>

Samples acceleration of change along the curve axis.

Source

pub fn sample_k(&self, factor: Scalar) -> Scalar

Sample curve K value at given factor.

Source

pub fn sample_curvature_radius(&self, factor: Scalar) -> Scalar

Sample curvature radius at given factor.

Source

pub fn sample_tangent(&self, factor: Scalar) -> T

Sample curve tangent at given factor.

Source

pub fn sample_tangent_along_axis( &self, axis_value: Scalar, axis_index: usize, ) -> Option<T>

Sample curve tangent at given axis value.

Source

pub fn split(&self, factor: Scalar) -> Result<(Self, Self), CurveError>

Splits curve into two parts at given factor.

Source

pub fn find_extremities(&self) -> Vec<Scalar>

Finds list of all time (factors) at which extremities exist.

Source

pub fn find_extremities_for_axis(&self, axis_index: usize) -> Vec<Scalar>

Finds list of all time (factors) at which extremities for given axis exist.

Source

pub fn find_intersections( &self, other: &Self, max_iterations: usize, min_length: Scalar, ) -> Result<Vec<(Scalar, Scalar)>, CurveError>

Finds list of all time (factors) pair tuples between this and other curve, at which two curves intersect.

Source

pub fn find_self_intersections( &self, max_iterations: usize, min_length: Scalar, ) -> Result<Vec<(Scalar, Scalar)>, CurveError>

Finds list of all time (factors) pair tuples at which this curve intersects with itself.

Source

pub fn find_distance_for_time(&self, factor: Scalar) -> Scalar

Finds distance along the curve for given time (factor).

Source

pub fn find_time_for_distance(&self, distance: Scalar) -> Scalar

Finds time (factor) for given distance along the curve.

Source

pub fn find_time_for_axis( &self, axis_value: Scalar, axis_index: usize, ) -> Option<Scalar>

Finds time (factor) for given axis value.

Source

pub fn find_time_closest_to_point(&self, point: &T) -> (Scalar, Scalar)

Finds time (factor) closest to given point. Returns tuple of: (time, distance)

Source

pub fn find_time_for( &self, guess: Option<Scalar>, iterations: Option<usize>, difference: impl FnMut(Scalar) -> Option<T>, validation: impl FnMut(Scalar) -> bool, ) -> Scalar

Finds best time (factor) for given estimate (guess) using provided function to calculate change in hidden value, until reaches number of iterations or derivative gets close to no change. Usually used for Newton-Raphson method of approximation.

Trait Implementations§

Source§

impl<T> Clone for Curve<T>
where T: Clone + Curved + CurvedChange + Clone,

Source§

fn clone(&self) -> Curve<T>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T> Debug for Curve<T>
where T: Clone + Curved + CurvedChange + Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T> Default for Curve<T>
where T: Clone + Curved + CurvedChange,

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<'de, T> Deserialize<'de> for Curve<T>
where T: Clone + Curved + CurvedChange + Deserialize<'de>,

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<T> From<Curve<T>> for CurveDef<T>
where T: Clone + Curved + CurvedChange,

Source§

fn from(v: Curve<T>) -> Self

Converts to this type from the input type.
Source§

impl<T> PartialEq for Curve<T>

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<T> Serialize for Curve<T>

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl<T> TryFrom<CurveDef<T>> for Curve<T>
where T: Clone + Curved + CurvedChange,

Source§

type Error = CurveError

The type returned in the event of a conversion error.
Source§

fn try_from(value: CurveDef<T>) -> Result<Self, Self::Error>

Performs the conversion.

Auto Trait Implementations§

§

impl<T> Freeze for Curve<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for Curve<T>
where T: RefUnwindSafe,

§

impl<T> Send for Curve<T>
where T: Send,

§

impl<T> Sync for Curve<T>
where T: Sync,

§

impl<T> Unpin for Curve<T>
where T: Unpin,

§

impl<T> UnwindSafe for Curve<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,