Skip to main content

Rigid

Struct Rigid 

Source
pub struct Rigid {
    pub rotation: [[f64; 3]; 3],
    pub translation: [f64; 3],
}
Expand description

Maps mesh B’s local coordinates into mesh A’s local coordinates: p_a = rotation * p_b + translation.

rotation is row-major (rotation[i][j] is row i, column j) and must be a proper rotation: orthonormal with determinant +1, within 1e-6 per entry. Scale and reflection are not supported, so distances measured in A’s space are distances between the meshes. Queries given anything else, or non-finite values, fail with QueryError::InvalidInput.

B’s vertices are transformed in f64 when they are tested and never stored. “Exact” intersection results are exact for those transformed f64 coordinates.

Fields§

§rotation: [[f64; 3]; 3]

The rotation, row-major.

§translation: [f64; 3]

The translation, applied after the rotation.

Implementations§

Source§

impl Rigid

Source

pub const IDENTITY: Rigid

The transform that leaves every point where it is.

Source

pub fn inverse(&self) -> Rigid

The transform that maps A’s coordinates back into B’s: the transposed rotation and the translation -rotationᵀ * translation.

Source

pub fn validate(&self) -> Result<()>

Checks that every value is finite and that the rotation is a proper rotation (orthonormal with determinant +1) within 1e-6 per entry: the check every mesh-vs-mesh query runs first.

§Errors

QueryError::InvalidInput for a non-finite value, a rotation that is not orthonormal, or a reflection.

Source

pub fn apply(&self, p: [f32; 3]) -> [f64; 3]

Maps a point of B into A’s space: rotation * p + translation, in f64.

This is the exact arithmetic (same expression, same order) the queries use to move B’s vertices, so points transformed with it agree bit for bit with what the queries tested. To map a result point such as MeshDistance::point_b back into B’s space, use apply on Rigid::inverse.

use fast_mesh_query::Rigid;

// A quarter turn about z, then a step along x.
let xf = Rigid {
    rotation: [[0.0, -1.0, 0.0], [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]],
    translation: [1.0, 0.0, 0.0],
};
assert_eq!(xf.validate(), Ok(()));
let in_a = xf.apply([1.0, 0.0, 0.0]);
assert_eq!(in_a, [1.0, 1.0, 0.0]);
let back = xf.inverse().apply(in_a.map(|v| v as f32));
assert_eq!(back, [1.0, 0.0, 0.0]);

Trait Implementations§

Source§

impl Clone for Rigid

Source§

fn clone(&self) -> Rigid

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Copy for Rigid

Source§

impl Debug for Rigid

Source§

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

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

impl PartialEq for Rigid

Source§

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

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

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

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Rigid

Auto Trait Implementations§

§

impl Freeze for Rigid

§

impl RefUnwindSafe for Rigid

§

impl Send for Rigid

§

impl Sync for Rigid

§

impl Unpin for Rigid

§

impl UnsafeUnpin for Rigid

§

impl UnwindSafe for Rigid

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.