Enum ElevationLaw

Source
#[non_exhaustive]
pub enum ElevationLaw { Polynomial { coefficients: Vec<f64>, }, Piecewise { breaks: Vec<f64>, laws: Vec<ElevationLaw>, }, }
Expand description

Height as a function of distance along the plan.

Mirrors CurvatureLaw in shape so the two halves of an alignment read the same way, but stays a separate type: a curvature law is a property of a planar curve and an elevation law is not, and sharing one enum would make a meaningless pairing representable.

Dirty imported data stays representable, as everywhere else in this crate. Mismatched piece lists report None rather than guessing.

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Polynomial

z(d) = coefficients[0] + coefficients[1] * d + coefficients[2] * d^2 + ...

Degree 1 is a constant gradient, degree 2 the parabolic vertical curve used to join two grades. Those are the two vertical segment kinds that carry most alignment data, and both are exact here.

An empty coefficient list is the zero polynomial: height zero.

Fields

§coefficients: Vec<f64>

Coefficients in ascending powers of plan distance.

§

Piecewise

Pieces laid end to end along plan distance, each with its own law.

breaks holds the INTERIOR seam positions measured from the start, so laws.len() == breaks.len() + 1 and piece i spans breaks[i - 1] .. breaks[i].

Each piece’s law is written in its OWN distance, restarting at zero at its seam, so moving a piece never rewrites its coefficients. This matches CurvatureLaw::Piecewise deliberately: a vertical profile is authored as a run of segments and the seams are observable data.

Fields

§breaks: Vec<f64>

Interior seam positions in plan distance, ascending.

§laws: Vec<ElevationLaw>

One law per piece; laws.len() == breaks.len() + 1.

Implementations§

Source§

impl ElevationLaw

Source

pub fn level(height: f64) -> ElevationLaw

A constant height.

Source

pub fn constant_grade(height: f64, grade: f64) -> ElevationLaw

A constant gradient: z(d) = height + grade * d.

Source

pub fn parabolic( height: f64, entry_grade: f64, exit_grade: f64, length: f64, ) -> ElevationLaw

A parabolic vertical curve joining entry_grade to exit_grade over length.

The rate of change of grade is (exit - entry) / length, so z(d) = height + entry * d + (exit - entry) / (2 * length) * d^2. A non-positive length is storable; naming it is a validator’s job.

Source

pub fn is_well_formed(&self) -> bool

Whether the piece lists agree and the seams ascend.

Source

pub fn height_at(&self, distance: f64) -> Option<f64>

Height at distance along the plan.

Returns None when the law is malformed or the distance is not finite, rather than extrapolating off a piece that does not exist.

Source

pub fn grade_at(&self, distance: f64) -> Option<f64>

Grade – dz/dd – at distance along the plan.

This is the slope the 3D tangent needs, and it is why the polynomial is differentiated exactly rather than differenced.

Trait Implementations§

Source§

impl Clone for ElevationLaw

Source§

fn clone(&self) -> ElevationLaw

Returns a copy 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 Debug for ElevationLaw

Source§

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

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

impl PartialEq for ElevationLaw

Source§

fn eq(&self, other: &ElevationLaw) -> 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 StructuralPartialEq for ElevationLaw

Auto Trait Implementations§

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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.
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,