Struct nalgebra::geometry::DualQuaternion [−][src]
#[repr(C)]pub struct DualQuaternion<T> {
pub real: Quaternion<T>,
pub dual: Quaternion<T>,
}
Expand description
A dual quaternion.
Indexing
DualQuaternions
are stored as [..real, ..dual].
Both of the quaternion components are laid out in i, j, k, w
order.
let real = Quaternion::new(1.0, 2.0, 3.0, 4.0);
let dual = Quaternion::new(5.0, 6.0, 7.0, 8.0);
let dq = DualQuaternion::from_real_and_dual(real, dual);
assert_eq!(dq[0], 2.0);
assert_eq!(dq[1], 3.0);
assert_eq!(dq[4], 6.0);
assert_eq!(dq[7], 5.0);
NOTE: As of December 2020, dual quaternion support is a work in progress. If a feature that you need is missing, feel free to open an issue or a PR. See https://github.com/dimforge/nalgebra/issues/487
Fields
real: Quaternion<T>
The real component of the quaternion
dual: Quaternion<T>
The dual component of the quaternion
Implementations
Normalizes this quaternion.
Example
let real = Quaternion::new(1.0, 2.0, 3.0, 4.0);
let dual = Quaternion::new(5.0, 6.0, 7.0, 8.0);
let dq = DualQuaternion::from_real_and_dual(real, dual);
let dq_normalized = dq.normalize();
relative_eq!(dq_normalized.real.norm(), 1.0);
Normalizes this quaternion.
Example
let real = Quaternion::new(1.0, 2.0, 3.0, 4.0);
let dual = Quaternion::new(5.0, 6.0, 7.0, 8.0);
let mut dq = DualQuaternion::from_real_and_dual(real, dual);
dq.normalize_mut();
relative_eq!(dq.real.norm(), 1.0);
The conjugate of this dual quaternion, containing the conjugate of the real and imaginary parts..
Example
let real = Quaternion::new(1.0, 2.0, 3.0, 4.0);
let dual = Quaternion::new(5.0, 6.0, 7.0, 8.0);
let dq = DualQuaternion::from_real_and_dual(real, dual);
let conj = dq.conjugate();
assert!(conj.real.i == -2.0 && conj.real.j == -3.0 && conj.real.k == -4.0);
assert!(conj.real.w == 1.0);
assert!(conj.dual.i == -6.0 && conj.dual.j == -7.0 && conj.dual.k == -8.0);
assert!(conj.dual.w == 5.0);
Replaces this quaternion by its conjugate.
Example
let real = Quaternion::new(1.0, 2.0, 3.0, 4.0);
let dual = Quaternion::new(5.0, 6.0, 7.0, 8.0);
let mut dq = DualQuaternion::from_real_and_dual(real, dual);
dq.conjugate_mut();
assert!(dq.real.i == -2.0 && dq.real.j == -3.0 && dq.real.k == -4.0);
assert!(dq.real.w == 1.0);
assert!(dq.dual.i == -6.0 && dq.dual.j == -7.0 && dq.dual.k == -8.0);
assert!(dq.dual.w == 5.0);
Inverts this dual quaternion if it is not zero.
Example
let real = Quaternion::new(1.0, 2.0, 3.0, 4.0);
let dual = Quaternion::new(5.0, 6.0, 7.0, 8.0);
let dq = DualQuaternion::from_real_and_dual(real, dual);
let inverse = dq.try_inverse();
assert!(inverse.is_some());
assert_relative_eq!(inverse.unwrap() * dq, DualQuaternion::identity());
//Non-invertible case
let zero = Quaternion::new(0.0, 0.0, 0.0, 0.0);
let dq = DualQuaternion::from_real_and_dual(zero, zero);
let inverse = dq.try_inverse();
assert!(inverse.is_none());
Inverts this dual quaternion in-place if it is not zero.
Example
let real = Quaternion::new(1.0, 2.0, 3.0, 4.0);
let dual = Quaternion::new(5.0, 6.0, 7.0, 8.0);
let dq = DualQuaternion::from_real_and_dual(real, dual);
let mut dq_inverse = dq;
dq_inverse.try_inverse_mut();
assert_relative_eq!(dq_inverse * dq, DualQuaternion::identity());
//Non-invertible case
let zero = Quaternion::new(0.0, 0.0, 0.0, 0.0);
let mut dq = DualQuaternion::from_real_and_dual(zero, zero);
assert!(!dq.try_inverse_mut());
Linear interpolation between two dual quaternions.
Computes self * (1 - t) + other * t
.
Example
let dq1 = DualQuaternion::from_real_and_dual(
Quaternion::new(1.0, 0.0, 0.0, 4.0),
Quaternion::new(0.0, 2.0, 0.0, 0.0)
);
let dq2 = DualQuaternion::from_real_and_dual(
Quaternion::new(2.0, 0.0, 1.0, 0.0),
Quaternion::new(0.0, 2.0, 0.0, 0.0)
);
assert_eq!(dq1.lerp(&dq2, 0.25), DualQuaternion::from_real_and_dual(
Quaternion::new(1.25, 0.0, 0.25, 3.0),
Quaternion::new(0.0, 2.0, 0.0, 0.0)
));
Creates a dual quaternion from its rotation and translation components.
Example
let rot = Quaternion::new(1.0, 2.0, 3.0, 4.0);
let trans = Quaternion::new(5.0, 6.0, 7.0, 8.0);
let dq = DualQuaternion::from_real_and_dual(rot, trans);
assert_eq!(dq.real.w, 1.0);
The dual quaternion multiplicative identity.
Example
let dq1 = DualQuaternion::identity();
let dq2 = DualQuaternion::from_real_and_dual(
Quaternion::new(1.,2.,3.,4.),
Quaternion::new(5.,6.,7.,8.)
);
assert_eq!(dq1 * dq2, dq2);
assert_eq!(dq2 * dq1, dq2);
pub fn cast<To: Scalar>(self) -> DualQuaternion<To> where
DualQuaternion<To>: SupersetOf<Self>,
pub fn cast<To: Scalar>(self) -> DualQuaternion<To> where
DualQuaternion<To>: SupersetOf<Self>,
Cast the components of self
to another type.
Example
let q = DualQuaternion::from_real(Quaternion::new(1.0f64, 2.0, 3.0, 4.0));
let q2 = q.cast::<f32>();
assert_eq!(q2, DualQuaternion::from_real(Quaternion::new(1.0f32, 2.0, 3.0, 4.0)));
Creates a dual quaternion from only its real part, with no translation component.
Example
let rot = Quaternion::new(1.0, 2.0, 3.0, 4.0);
let dq = DualQuaternion::from_real(rot);
assert_eq!(dq.real.w, 1.0);
assert_eq!(dq.dual.w, 0.0);
Trait Implementations
type Epsilon = T
type Epsilon = T
Used for specifying relative comparisons.
The default tolerance to use when testing values that are close together. Read more
A test for equality that uses the absolute difference to compute the approximate equality of two numbers. Read more
The inverse of AbsDiffEq::abs_diff_eq
.
impl<'a, 'b, T: SimdRealField> Add<&'b DualQuaternion<T>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
impl<'a, 'b, T: SimdRealField> Add<&'b DualQuaternion<T>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the +
operator.
Performs the +
operation. Read more
impl<'b, T: SimdRealField> Add<&'b DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<'b, T: SimdRealField> Add<&'b DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the +
operator.
Performs the +
operation. Read more
impl<'a, T: SimdRealField> Add<DualQuaternion<T>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
impl<'a, T: SimdRealField> Add<DualQuaternion<T>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the +
operator.
Performs the +
operation. Read more
impl<T: SimdRealField> Add<DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<T: SimdRealField> Add<DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the +
operator.
Performs the +
operation. Read more
impl<'b, T: SimdRealField> AddAssign<&'b DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<'b, T: SimdRealField> AddAssign<&'b DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
Performs the +=
operation. Read more
impl<T: SimdRealField> AddAssign<DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<T: SimdRealField> AddAssign<DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
Performs the +=
operation. Read more
fn deserialize<Des>(deserializer: Des) -> Result<Self, Des::Error> where
Des: Deserializer<'a>,
fn deserialize<Des>(deserializer: Des) -> Result<Self, Des::Error> where
Des: Deserializer<'a>,
Deserialize this value from the given Serde deserializer. Read more
impl<'a, 'b, T: SimdRealField> Div<&'b Unit<DualQuaternion<T>>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
impl<'a, 'b, T: SimdRealField> Div<&'b Unit<DualQuaternion<T>>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the /
operator.
Performs the /
operation. Read more
impl<'b, T: SimdRealField> Div<&'b Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<'b, T: SimdRealField> Div<&'b Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the /
operator.
Performs the /
operation. Read more
impl<'a, T: SimdRealField> Div<Unit<DualQuaternion<T>>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
impl<'a, T: SimdRealField> Div<Unit<DualQuaternion<T>>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the /
operator.
Performs the /
operation. Read more
impl<T: SimdRealField> Div<Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<T: SimdRealField> Div<Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the /
operator.
Performs the /
operation. Read more
impl<'b, T: SimdRealField> DivAssign<&'b Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<'b, T: SimdRealField> DivAssign<&'b Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
Performs the /=
operation. Read more
Performs the /=
operation. Read more
impl<T: SimdRealField> DivAssign<Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<T: SimdRealField> DivAssign<Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
Performs the /=
operation. Read more
impl<'a, 'b, T: SimdRealField> Mul<&'b DualQuaternion<T>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
impl<'a, 'b, T: SimdRealField> Mul<&'b DualQuaternion<T>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the *
operator.
Performs the *
operation. Read more
impl<'b, T: SimdRealField> Mul<&'b DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<'b, T: SimdRealField> Mul<&'b DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the *
operator.
Performs the *
operation. Read more
impl<'a, 'b, T: SimdRealField> Mul<&'b DualQuaternion<T>> for &'a UnitDualQuaternion<T> where
T::Element: SimdRealField,
impl<'a, 'b, T: SimdRealField> Mul<&'b DualQuaternion<T>> for &'a UnitDualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the *
operator.
Performs the *
operation. Read more
impl<'b, T: SimdRealField> Mul<&'b DualQuaternion<T>> for UnitDualQuaternion<T> where
T::Element: SimdRealField,
impl<'b, T: SimdRealField> Mul<&'b DualQuaternion<T>> for UnitDualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the *
operator.
Performs the *
operation. Read more
type Output = DualQuaternion<f32>
type Output = DualQuaternion<f32>
The resulting type after applying the *
operator.
type Output = DualQuaternion<f64>
type Output = DualQuaternion<f64>
The resulting type after applying the *
operator.
impl<'a, 'b, T: SimdRealField> Mul<&'b Unit<DualQuaternion<T>>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
impl<'a, 'b, T: SimdRealField> Mul<&'b Unit<DualQuaternion<T>>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the *
operator.
Performs the *
operation. Read more
impl<'b, T: SimdRealField> Mul<&'b Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<'b, T: SimdRealField> Mul<&'b Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the *
operator.
Performs the *
operation. Read more
impl<'a, T: SimdRealField> Mul<DualQuaternion<T>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
impl<'a, T: SimdRealField> Mul<DualQuaternion<T>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the *
operator.
Performs the *
operation. Read more
impl<T: SimdRealField> Mul<DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<T: SimdRealField> Mul<DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the *
operator.
Performs the *
operation. Read more
impl<'a, T: SimdRealField> Mul<DualQuaternion<T>> for &'a UnitDualQuaternion<T> where
T::Element: SimdRealField,
impl<'a, T: SimdRealField> Mul<DualQuaternion<T>> for &'a UnitDualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the *
operator.
Performs the *
operation. Read more
impl<T: SimdRealField> Mul<DualQuaternion<T>> for UnitDualQuaternion<T> where
T::Element: SimdRealField,
impl<T: SimdRealField> Mul<DualQuaternion<T>> for UnitDualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the *
operator.
Performs the *
operation. Read more
type Output = DualQuaternion<f32>
type Output = DualQuaternion<f32>
The resulting type after applying the *
operator.
type Output = DualQuaternion<f64>
type Output = DualQuaternion<f64>
The resulting type after applying the *
operator.
impl<'a, T: SimdRealField> Mul<Unit<DualQuaternion<T>>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
impl<'a, T: SimdRealField> Mul<Unit<DualQuaternion<T>>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the *
operator.
Performs the *
operation. Read more
impl<T: SimdRealField> Mul<Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<T: SimdRealField> Mul<Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the *
operator.
Performs the *
operation. Read more
impl<'b, T: SimdRealField> MulAssign<&'b DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<'b, T: SimdRealField> MulAssign<&'b DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
Performs the *=
operation. Read more
impl<'b, T: SimdRealField> MulAssign<&'b Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<'b, T: SimdRealField> MulAssign<&'b Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
Performs the *=
operation. Read more
impl<T: SimdRealField> MulAssign<DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<T: SimdRealField> MulAssign<DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
Performs the *=
operation. Read more
Performs the *=
operation. Read more
impl<T: SimdRealField> MulAssign<Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<T: SimdRealField> MulAssign<Unit<DualQuaternion<T>>> for DualQuaternion<T> where
T::Element: SimdRealField,
Performs the *=
operation. Read more
type Norm = T::SimdRealField
type Norm = T::SimdRealField
The type of the norm.
Computes the norm.
Computes the squared norm.
Divides self
by n.
impl<T: RealField + RelativeEq<Epsilon = T>> RelativeEq<DualQuaternion<T>> for DualQuaternion<T>
impl<T: RealField + RelativeEq<Epsilon = T>> RelativeEq<DualQuaternion<T>> for DualQuaternion<T>
The default relative tolerance for testing values that are far-apart. Read more
A test for equality that uses a relative comparison if the values are far apart.
The inverse of RelativeEq::relative_eq
.
fn serialize<S>(
&self,
serializer: S
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
S: Serializer,
fn serialize<S>(
&self,
serializer: S
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
S: Serializer,
Serialize this value into the given Serde serializer. Read more
impl<'a, 'b, T: SimdRealField> Sub<&'b DualQuaternion<T>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
impl<'a, 'b, T: SimdRealField> Sub<&'b DualQuaternion<T>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the -
operator.
Performs the -
operation. Read more
impl<'b, T: SimdRealField> Sub<&'b DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<'b, T: SimdRealField> Sub<&'b DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the -
operator.
Performs the -
operation. Read more
impl<'a, T: SimdRealField> Sub<DualQuaternion<T>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
impl<'a, T: SimdRealField> Sub<DualQuaternion<T>> for &'a DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the -
operator.
Performs the -
operation. Read more
impl<T: SimdRealField> Sub<DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<T: SimdRealField> Sub<DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
type Output = DualQuaternion<T>
type Output = DualQuaternion<T>
The resulting type after applying the -
operator.
Performs the -
operation. Read more
impl<'b, T: SimdRealField> SubAssign<&'b DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<'b, T: SimdRealField> SubAssign<&'b DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
Performs the -=
operation. Read more
impl<T: SimdRealField> SubAssign<DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
impl<T: SimdRealField> SubAssign<DualQuaternion<T>> for DualQuaternion<T> where
T::Element: SimdRealField,
Performs the -=
operation. Read more
impl<T1, T2> SubsetOf<DualQuaternion<T2>> for DualQuaternion<T1> where
T1: SimdRealField,
T2: SimdRealField + SupersetOf<T1>,
impl<T1, T2> SubsetOf<DualQuaternion<T2>> for DualQuaternion<T1> where
T1: SimdRealField,
T2: SimdRealField + SupersetOf<T1>,
The inclusion map: converts self
to the equivalent element of its superset.
Checks if element
is actually part of the subset Self
(and can be converted to it).
Use with care! Same as self.to_superset
but without any property checks. Always succeeds.
The inverse inclusion map: attempts to construct self
from the equivalent element of its
superset. Read more
The default ULPs to tolerate when testing values that are far-apart. Read more
A test for equality that uses units in the last place (ULP) if the values are far apart.
Auto Trait Implementations
impl<T> RefUnwindSafe for DualQuaternion<T> where
T: RefUnwindSafe,
impl<T> Send for DualQuaternion<T> where
T: Send,
impl<T> Sync for DualQuaternion<T> where
T: Sync,
impl<T> Unpin for DualQuaternion<T> where
T: Unpin,
impl<T> UnwindSafe for DualQuaternion<T> where
T: UnwindSafe,
Blanket Implementations
Mutably borrows from an owned value. Read more
The inverse inclusion map: attempts to construct self
from the equivalent element of its
superset. Read more
Checks if self
is actually part of its subset T
(and can be converted to it).
Use with care! Same as self.to_subset
but without any property checks. Always succeeds.
The inclusion map: converts self
to the equivalent element of its superset.