Skip to main content

Reflection

Struct Reflection 

Source
pub struct Reflection { /* private fields */ }
Expand description

Reflection in the plane through origin with unit normal: p ↦ p − 2((p − o)·n) n. Lengths and angles are preserved and handedness is reversed, which is why it is a type of its own and not an crate::Isometry, whose every value is proper (ADR-0031).

use arris_math::{Point3, Reflection, Vec3};

let r = Reflection::new(Point3::new(0.0, 0.0, 1.0), Vec3::z()).unwrap();
assert_eq!(r.apply(Point3::new(1.0, 2.0, 3.0)), Point3::new(1.0, 2.0, -1.0));
// Reflecting twice returns the point.
let p = Point3::new(0.3, -0.4, 5.0);
assert!((r.apply(r.apply(p)) - p).norm() < 1e-15);
assert!(Reflection::new(Point3::origin(), Vec3::zeros()).is_err());

Implementations§

Source§

impl Reflection

Source

pub fn new(origin: Point3, normal: Vec3) -> Result<Self, ReflectionError>

The plane through origin with normal along normal (normalised). Errors: a non-finite input, or a zero normal.

Source

pub fn plane_through( origin: Point3, normal: Vec3, ) -> Result<Self, ReflectionError>

The same as Reflection::new: the plane is named by a point on it and its normal.

Source

pub fn origin(&self) -> Point3

A point on the plane.

Source

pub fn normal(&self) -> UnitVec3

The plane’s unit normal.

Source

pub fn apply(&self, p: Point3) -> Point3

The mirror image of p.

Source

pub fn apply_vec(&self, v: Vec3) -> Vec3

The image of a displacement: the plane’s offset does not act on it.

Source

pub fn apply_unit(&self, u: UnitVec3) -> UnitVec3

The image of a direction, re-normalised so it is unit to rounding.

Source

pub fn apply_frame(&self, frame: &Frame) -> Frame

The image of a frame as a quadric is placed after a mirror: O′ = R O, X′ = R X, Y′ = −R Y, Z′ = R Z. Right-handed by construction (X′ × Y′ = R Z); the surface it places is the mirror image reparametrised by u ↦ 2π − u (ADR-0031 §2).

use arris_math::{Frame, Reflection, Vec3, Point3};

let r = Reflection::new(Point3::origin(), Vec3::x()).unwrap();
let f = r.apply_frame(&Frame::world());
assert!((f.x().into_inner() - (-Vec3::x())).norm() < 1e-15);
assert!((f.y().into_inner() - (-Vec3::y())).norm() < 1e-15);
assert!((f.z().into_inner() - Vec3::z()).norm() < 1e-15);
Source

pub fn apply_frame_reversed(&self, frame: &Frame) -> Frame

The image of a frame keeping the parametrisation of what it places: O′ = R O, X′ = R X, Y′ = R Y, Z′ = X′ × Y′ = −R Z. A plane’s and a conic curve’s frame after a mirror (ADR-0031 §2): the same parameters, the normal turned the other way.

Trait Implementations§

Source§

impl Clone for Reflection

Source§

fn clone(&self) -> Self

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 Reflection

Source§

impl Debug for Reflection

Source§

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

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

impl PartialEq for Reflection

Source§

fn eq(&self, other: &Self) -> 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 Reflection

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

Source§

type Output = T

Should always be Self
Source§

impl<T> Scalar for T
where T: 'static + Clone + PartialEq + Debug,

Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
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 = !

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

fn try_from(value: U) -> Result<T, !>

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.