#[repr(transparent)]pub struct UnitBlade<T: AllocBlade<N, G>, N: Dim, G: Dim> { /* private fields */ }
Expand description
A SimpleBlade
with unit length
Primary use is to represent oriented vector spaces of dimension G
. If the quantity is going
to be stored/cached for an extended period of time, this can also provide an optimization over
a SimpleBlade
since the length does not have to be accounted for.
Implementations
Returns the i
th basis element or panics if i
is out of range
Unrwaps self
into its internal algebraic type
Unrwaps self
into a reference to its internal algebraic type
Creates a new value of Self
from an internal algebraic type
assuming that it satisfies all the guarrantees of this type
Safety
This function is not marked unsafe
since there is no way an invalid
argument could violate any of Rust’s memory safety rules. However, caution
should still be taken since an invalid input can still dramatically break
many other functions of this type.
pub fn cast_dim_generic_unchecked<N2: Dim>(self, n: N2) -> UnitBlade<T, N2, G> where
T: AllocBlade<N2, G>,
pub fn cast_dim_generic_unchecked<N2: Dim>(self, n: N2) -> UnitBlade<T, N2, G> where
T: AllocBlade<N2, G>,
Embeds self
into a different dimension by either removing elements or inserting zeros
pub fn cast_dim_dyn_unchecked(self, n: usize) -> UnitBlade<T, Dynamic, G> where
T: AllocBlade<Dynamic, G>,
pub fn cast_dim_dyn_unchecked(self, n: usize) -> UnitBlade<T, Dynamic, G> where
T: AllocBlade<Dynamic, G>,
Embeds self
into a different dimension by either removing elements or inserting zeros
pub fn cast_dim_unchecked<N2: DimName>(self) -> UnitBlade<T, N2, G> where
T: AllocBlade<N2, G>,
pub fn cast_dim_unchecked<N2: DimName>(self) -> UnitBlade<T, N2, G> where
T: AllocBlade<N2, G>,
Embeds self
into a different dimension by either removing elements or inserting zeros
pub fn cast_dim<N2: DimName>(self) -> UnitBlade<T, N2, G> where
T: AllocBlade<N2, G>,
N1: IsLessOrEqual<N2, Output = True>,
pub fn cast_dim<N2: DimName>(self) -> UnitBlade<T, N2, G> where
T: AllocBlade<N2, G>,
N1: IsLessOrEqual<N2, Output = True>,
Embeds self
into a different dimension by either removing elements or inserting zeros
impl<T: AllocBlade<N, G>, N: Dim, G: Dim> UnitBlade<T, N, G> where
N: DimSub<G>,
T: AllocBlade<N, DimDiff<N, G>> + Neg<Output = T>,
impl<T: AllocBlade<N, G>, N: Dim, G: Dim> UnitBlade<T, N, G> where
N: DimSub<G>,
T: AllocBlade<N, DimDiff<N, G>> + Neg<Output = T>,
Finds the dual of this unit blade. See Blade::dual()
for more information
Finds the inverse dual of this unit blade. See Blade::undual()
for more information
Returns the unit psuedoscalar in dimension N
Methods from Deref<Target = Blade<T, N, G>>
Returns the dimension of this value as an instance of the generic type N
This is mostly used internally to unify the codebase between Const
dimensions
and Dynamic
dimensions. Since Dynamic
grades often require a usize
input when
Const
grades do not, this allows a function to take a ZST for static dimensions
and to take a numeric value for dynamic ones
Returns the grade of this Blade as an instance of the generic type G
This is mostly used internally to unify the codebase between Const
grades
and Dynamic
grades. Since Dynamic
grades often require a usize
input when
Const
grades do not, this allows a function to take a ZST for static Blades
and to take a numeric value for dynamic ones
The number of dimensions this value resides in
Note that this differs from both the grade and number of elements. Instead, this describes the dimension of the vector space generating the algebra this blade resides in.
Examples
//All of these live in 3-dimensions
let v = Vec3::new(3, 1, 4);
let b = BiVec3::new(6, 2, 8);
let r = Even3::new(1, 6, 1, 8);
let m = Multivector3::new(0, 5, 7, 7, 2, 1, 5, 6);
assert_eq!(v.dim(), 3);
assert_eq!(b.dim(), 3);
assert_eq!(r.dim(), 3);
assert_eq!(m.dim(), 3);
//whereas these are in 4D
let v = Vec4::from_element(6);
let b = BiVec4::from_element(2);
let r = Even4::from_element(8);
let m = Multivector4::from_element(3);
assert_eq!(v.dim(), 4);
assert_eq!(b.dim(), 4);
assert_eq!(r.dim(), 4);
assert_eq!(m.dim(), 4);
The grade of this blade
This describes the “dimension” of the vector space this blade represents. Note that this is completely different that the dimension of the blade which describes the the dimension of the surrounding space the blade lives in.
More concretely, the grade is the number of vector basis elements multiplied together to get a basis of this blade. So to get a blade of grade 3, you would need to wedge three vectors together.
Examples
//All vectors are grade 1
let v1 = Vec3::new(6, 2, 8);
let v2 = Vec6::new(6, 2, 8, 3, 1, 8);
let v3 = VecD::from_element(2, 0.0);
assert_eq!(v1.grade(), 1);
assert_eq!(v2.grade(), 1);
assert_eq!(v3.grade(), 1);
//All Bivectors are grade 2
let b1 = BiVec4::new(6, 2, 8, 3, 1, 8);
let b2 = BiVecD::from_element(3, 0.0);
assert_eq!(b1.grade(), 2);
assert_eq!(b2.grade(), 2);
//Dynamic blades
let blade1 = Blade6::from_element(5, 0.0);
let blade2 = BladeD::from_element(4, 3, 0.0);
assert_eq!(blade1.grade(), 5);
assert_eq!(blade2.grade(), 3);
The number of coordinates this value has
Note that for all values besides vectors and psuedovectors, this is completely different than the dimension which instead measures the dimension of the space the value lives in.
- For blades, this value is equal to number of combinations of size
self.grade()
you can make fromself.dim()
basis vectors, iebinom(self.dim(), self.grade())
. - For even values, the number of elements is
2^(self.dim()-1)
with the exception of1
when the dimension is0
- For general multivectors, there are
2^self.dim()
components
Finally, note that in all cases, the value returned is either a compile-time constant or cached as the length of some array, so there is no computational overhead to this function.
Examples
let v = Vec4::from_element(0);
let b = BiVec4::from_element(0);
let r = Even4::from_element(0);
let m = Multivector4::from_element(0);
assert_eq!(v.elements(), 4); // (4 choose 1) = 4
assert_eq!(b.elements(), 6); // (4 choose 2) = 6
assert_eq!(r.elements(), 8); // 2^(4-1) = 8
assert_eq!(m.elements(), 16); // 2^4 = 16
Borrows the components of this value as a slice
The sum of squares of each element
Note that this does not take into account the conjugate of any complex elements. This is by explicit design:
- We can relax the
ComplexField
requirement and have more possibilies for scalars types (like polynomials!). - For vectors, this should give the quadradic form of the Clifford
algebra, but the function
Q(z) = zz̅
is not a valid quadradic form†
Finds the parallel component of b
onto self
Trait Implementations
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<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> AbsDiffEq<SimpleBlade<T2, N2, G2>> for UnitBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + AbsDiffEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> AbsDiffEq<SimpleBlade<T2, N2, G2>> for UnitBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + AbsDiffEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
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
.
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<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> AbsDiffEq<UnitBlade<T2, N2, G2>> for SimpleBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + AbsDiffEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> AbsDiffEq<UnitBlade<T2, N2, G2>> for SimpleBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + AbsDiffEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
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
.
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<'b, T1, T2, U, N: Dim, G: Dim> Div<&'b UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G: Dim> Div<&'b UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G: Dim> Div<&'b UnitBlade<T2, N, G>> for &'a Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G: Dim> Div<&'b UnitBlade<T2, N, G>> for &'a Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> Div<&'b UnitBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> Div<&'b UnitBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> Div<&'b UnitBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> Div<&'b UnitBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G: Dim> Div<&'b Versor<T2, N>> for UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G: Dim> Div<&'b Versor<T2, N>> for UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G: Dim> Div<&'b Versor<T2, N>> for &'a UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G: Dim> Div<&'b Versor<T2, N>> for &'a UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<T1, T2, U, N: Dim, G: Dim> Div<UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<T1, T2, U, N: Dim, G: Dim> Div<UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G: Dim> Div<UnitBlade<T2, N, G>> for &'a Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G: Dim> Div<UnitBlade<T2, N, G>> for &'a Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<T1, T2, U, N: Dim, G1: Dim, G2: Dim> Div<UnitBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<T1, T2, U, N: Dim, G1: Dim, G2: Dim> Div<UnitBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G1: Dim, G2: Dim> Div<UnitBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G1: Dim, G2: Dim> Div<UnitBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<T1, T2, U, N: Dim, G: Dim> Div<Versor<T2, N>> for UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<T1, T2, U, N: Dim, G: Dim> Div<Versor<T2, N>> for UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G: Dim> Div<Versor<T2, N>> for &'a UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G: Dim> Div<Versor<T2, N>> for &'a UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N> + Clone + Neg<Output = T2>,
U: AllocVersor<N> + AddGroup,
Performs the /=
operation. Read more
Performs the /=
operation. Read more
Performs the conversion.
impl<'b, T1, T2, U, N: Dim, G: Dim> Mul<&'b UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocVersor<N> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G: Dim> Mul<&'b UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocVersor<N> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G: Dim> Mul<&'b UnitBlade<T2, N, G>> for &'a Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocVersor<N> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G: Dim> Mul<&'b UnitBlade<T2, N, G>> for &'a Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocVersor<N> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> Mul<&'b UnitBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocVersor<N> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> Mul<&'b UnitBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocVersor<N> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> Mul<&'b UnitBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocVersor<N> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> Mul<&'b UnitBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocVersor<N> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G: Dim> Mul<&'b Versor<T2, N>> for UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G: Dim> Mul<&'b Versor<T2, N>> for UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G: Dim> Mul<&'b Versor<T2, N>> for &'a UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G: Dim> Mul<&'b Versor<T2, N>> for &'a UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + AddGroup,
impl<T1, T2, U, N: Dim, G: Dim> Mul<UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocVersor<N> + AddGroup,
impl<T1, T2, U, N: Dim, G: Dim> Mul<UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G: Dim> Mul<UnitBlade<T2, N, G>> for &'a Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G: Dim> Mul<UnitBlade<T2, N, G>> for &'a Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocVersor<N> + AddGroup,
impl<T1, T2, U, N: Dim, G1: Dim, G2: Dim> Mul<UnitBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocVersor<N> + AddGroup,
impl<T1, T2, U, N: Dim, G1: Dim, G2: Dim> Mul<UnitBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G1: Dim, G2: Dim> Mul<UnitBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G1: Dim, G2: Dim> Mul<UnitBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocVersor<N> + AddGroup,
impl<T1, T2, U, N: Dim, G: Dim> Mul<Versor<T2, N>> for UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + AddGroup,
impl<T1, T2, U, N: Dim, G: Dim> Mul<Versor<T2, N>> for UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G: Dim> Mul<Versor<T2, N>> for &'a UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G: Dim> Mul<Versor<T2, N>> for &'a UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + AddGroup,
impl<'a, T1, T2, N: Dim, G: Dim> MulAssign<&'a UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = T1> + AddGroup,
T2: AllocBlade<N, G>,
impl<'a, T1, T2, N: Dim, G: Dim> MulAssign<&'a UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = T1> + AddGroup,
T2: AllocBlade<N, G>,
Performs the *=
operation. Read more
impl<T1, T2, N: Dim, G: Dim> MulAssign<UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = T1> + AddGroup,
T2: AllocBlade<N, G>,
impl<T1, T2, N: Dim, G: Dim> MulAssign<UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = T1> + AddGroup,
T2: AllocBlade<N, G>,
Performs the *=
operation. Read more
impl<T, U, N: Dim, G: Dim> Neg for UnitBlade<T, N, G> where
T: AllocBlade<N, G>,
U: AllocBlade<N, G>,
T: Neg<Output = U>,
impl<T, U, N: Dim, G: Dim> Neg for UnitBlade<T, N, G> where
T: AllocBlade<N, G>,
U: AllocBlade<N, G>,
T: Neg<Output = U>,
impl<'a, T, U, N: Dim, G: Dim> Neg for &'a UnitBlade<T, N, G> where
T: AllocBlade<N, G>,
U: AllocBlade<N, G>,
T: RefNeg<'a, Output = U>,
impl<'a, T, U, N: Dim, G: Dim> Neg for &'a UnitBlade<T, N, G> where
T: AllocBlade<N, G>,
U: AllocBlade<N, G>,
T: RefNeg<'a, Output = U>,
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> PartialEq<SimpleBlade<T2, N2, G2>> for UnitBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + PartialEq<T2>,
T2: AllocBlade<N2, G2>,
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> PartialEq<SimpleBlade<T2, N2, G2>> for UnitBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + PartialEq<T2>,
T2: AllocBlade<N2, G2>,
This method tests for self
and other
values to be equal, and is used
by ==
. Read more
This method tests for !=
.
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> PartialEq<UnitBlade<T2, N2, G2>> for SimpleBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + PartialEq<T2>,
T2: AllocBlade<N2, G2>,
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> PartialEq<UnitBlade<T2, N2, G2>> for SimpleBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + PartialEq<T2>,
T2: AllocBlade<N2, G2>,
impl<T, N: Dim, G1: Dim, G2: Dim> Project<Blade<T, N, G2>> for UnitBlade<T, N, G1> where
G2: DimSymSub<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSymDiff<G2, G1>> + RefDivRing,
impl<T, N: Dim, G1: Dim, G2: Dim> Project<Blade<T, N, G2>> for UnitBlade<T, N, G1> where
G2: DimSymSub<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSymDiff<G2, G1>> + RefDivRing,
impl<T, N: Dim, G1: Dim, G2: Dim> Project<SimpleBlade<T, N, G2>> for UnitBlade<T, N, G1> where
G2: DimSymSub<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSymDiff<G2, G1>> + RefDivRing,
impl<T, N: Dim, G1: Dim, G2: Dim> Project<SimpleBlade<T, N, G2>> for UnitBlade<T, N, G1> where
G2: DimSymSub<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSymDiff<G2, G1>> + RefDivRing,
type Output = SimpleBlade<T, N, G2>
impl<T, N: Dim, G1: Dim, G2: Dim> Project<UnitBlade<T, N, G2>> for Blade<T, N, G1> where
G2: DimSymSub<G1>,
T: AllocBlade<N, G1> + AllocSimpleBlade<N, G2> + AllocBlade<N, DimSymDiff<G2, G1>> + RefDivRing,
impl<T, N: Dim, G1: Dim, G2: Dim> Project<UnitBlade<T, N, G2>> for Blade<T, N, G1> where
G2: DimSymSub<G1>,
T: AllocBlade<N, G1> + AllocSimpleBlade<N, G2> + AllocBlade<N, DimSymDiff<G2, G1>> + RefDivRing,
type Output = SimpleBlade<T, N, G2>
impl<T, N: Dim, G1: Dim, G2: Dim> Project<UnitBlade<T, N, G2>> for SimpleBlade<T, N, G1> where
G2: DimSymSub<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSymDiff<G2, G1>> + RefDivRing,
impl<T, N: Dim, G1: Dim, G2: Dim> Project<UnitBlade<T, N, G2>> for SimpleBlade<T, N, G1> where
G2: DimSymSub<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSymDiff<G2, G1>> + RefDivRing,
type Output = SimpleBlade<T, N, G2>
impl<T, N: Dim, G1: Dim, G2: Dim> Project<UnitBlade<T, N, G2>> for UnitBlade<T, N, G1> where
G2: DimSymSub<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSymDiff<G2, G1>> + RefDivRing,
impl<T, N: Dim, G1: Dim, G2: Dim> Project<UnitBlade<T, N, G2>> for UnitBlade<T, N, G1> where
G2: DimSymSub<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSymDiff<G2, G1>> + RefDivRing,
type Output = SimpleBlade<T, N, G2>
impl<T, N: Dim, G1: Dim, G2: Dim> Reject<Blade<T, N, G2>> for UnitBlade<T, N, G1> where
G2: DimAdd<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSum<G2, G1>> + RefDivRing,
impl<T, N: Dim, G1: Dim, G2: Dim> Reject<Blade<T, N, G2>> for UnitBlade<T, N, G1> where
G2: DimAdd<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSum<G2, G1>> + RefDivRing,
impl<T, N: Dim, G1: Dim, G2: Dim> Reject<SimpleBlade<T, N, G2>> for UnitBlade<T, N, G1> where
G2: DimAdd<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSum<G2, G1>> + RefDivRing,
impl<T, N: Dim, G1: Dim, G2: Dim> Reject<SimpleBlade<T, N, G2>> for UnitBlade<T, N, G1> where
G2: DimAdd<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSum<G2, G1>> + RefDivRing,
type Output = SimpleBlade<T, N, G2>
impl<T, N: Dim, G1: Dim, G2: Dim> Reject<UnitBlade<T, N, G2>> for Blade<T, N, G1> where
G2: DimAdd<G1>,
T: AllocBlade<N, G1> + AllocSimpleBlade<N, G2> + AllocBlade<N, DimSum<G2, G1>> + RefDivRing,
impl<T, N: Dim, G1: Dim, G2: Dim> Reject<UnitBlade<T, N, G2>> for Blade<T, N, G1> where
G2: DimAdd<G1>,
T: AllocBlade<N, G1> + AllocSimpleBlade<N, G2> + AllocBlade<N, DimSum<G2, G1>> + RefDivRing,
type Output = SimpleBlade<T, N, G2>
impl<T, N: Dim, G1: Dim, G2: Dim> Reject<UnitBlade<T, N, G2>> for SimpleBlade<T, N, G1> where
G2: DimAdd<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSum<G2, G1>> + RefDivRing,
impl<T, N: Dim, G1: Dim, G2: Dim> Reject<UnitBlade<T, N, G2>> for SimpleBlade<T, N, G1> where
G2: DimAdd<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSum<G2, G1>> + RefDivRing,
type Output = SimpleBlade<T, N, G2>
impl<T, N: Dim, G1: Dim, G2: Dim> Reject<UnitBlade<T, N, G2>> for UnitBlade<T, N, G1> where
G2: DimAdd<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSum<G2, G1>> + RefDivRing,
impl<T, N: Dim, G1: Dim, G2: Dim> Reject<UnitBlade<T, N, G2>> for UnitBlade<T, N, G1> where
G2: DimAdd<G1>,
T: AllocBlade<N, G1> + AllocBlade<N, G2> + AllocBlade<N, DimSum<G2, G1>> + RefDivRing,
type Output = SimpleBlade<T, N, G2>
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> RelativeEq<Blade<T2, N2, G2>> for UnitBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + RelativeEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> RelativeEq<Blade<T2, N2, G2>> for UnitBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + RelativeEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
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
.
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> RelativeEq<SimpleBlade<T2, N2, G2>> for UnitBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + RelativeEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> RelativeEq<SimpleBlade<T2, N2, G2>> for UnitBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + RelativeEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
The default relative tolerance for testing values that are far-apart. Read more
fn relative_eq(
&self,
rhs: &SimpleBlade<T2, N2, G2>,
epsilon: T1::Epsilon,
max_relative: T1::Epsilon
) -> bool
fn relative_eq(
&self,
rhs: &SimpleBlade<T2, N2, G2>,
epsilon: T1::Epsilon,
max_relative: T1::Epsilon
) -> bool
A test for equality that uses a relative comparison if the values are far apart.
fn relative_ne(
&self,
rhs: &SimpleBlade<T2, N2, G2>,
epsilon: T1::Epsilon,
max_relative: T1::Epsilon
) -> bool
fn relative_ne(
&self,
rhs: &SimpleBlade<T2, N2, G2>,
epsilon: T1::Epsilon,
max_relative: T1::Epsilon
) -> bool
The inverse of RelativeEq::relative_eq
.
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> RelativeEq<UnitBlade<T2, N2, G2>> for Blade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + RelativeEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> RelativeEq<UnitBlade<T2, N2, G2>> for Blade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + RelativeEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
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
.
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> RelativeEq<UnitBlade<T2, N2, G2>> for SimpleBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + RelativeEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> RelativeEq<UnitBlade<T2, N2, G2>> for SimpleBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + RelativeEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
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
.
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> RelativeEq<UnitBlade<T2, N2, G2>> for UnitBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + RelativeEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> RelativeEq<UnitBlade<T2, N2, G2>> for UnitBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + RelativeEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
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
.
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.
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> UlpsEq<SimpleBlade<T2, N2, G2>> for UnitBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + UlpsEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> UlpsEq<SimpleBlade<T2, N2, G2>> for UnitBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + UlpsEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
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.
The inverse of UlpsEq::ulps_eq
.
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.
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> UlpsEq<UnitBlade<T2, N2, G2>> for SimpleBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + UlpsEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
impl<T1, T2, N1: Dim, G1: Dim, N2: Dim, G2: Dim> UlpsEq<UnitBlade<T2, N2, G2>> for SimpleBlade<T1, N1, G1> where
T1: AllocBlade<N1, G1> + UlpsEq<T2>,
T2: AllocBlade<N2, G2>,
T1::Epsilon: Clone,
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.
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.
impl<'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<&'b Blade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<&'b Blade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<&'b Blade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<&'b Blade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G1: Dim> VersorMul<&'b Multivector<T2, N>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocMultivector<N>,
U: AllocMultivector<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G1: Dim> VersorMul<&'b Multivector<T2, N>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocMultivector<N>,
U: AllocMultivector<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
type Output = Multivector<U, N>
impl<'a, 'b, T1, T2, U, N: Dim, G1: Dim> VersorMul<&'b Multivector<T2, N>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocMultivector<N>,
U: AllocMultivector<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G1: Dim> VersorMul<&'b Multivector<T2, N>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocMultivector<N>,
U: AllocMultivector<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
type Output = Multivector<U, N>
impl<'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<&'b SimpleBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<&'b SimpleBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
type Output = SimpleBlade<U, N, G2>
impl<'a, 'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<&'b SimpleBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<&'b SimpleBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
type Output = SimpleBlade<U, N, G2>
impl<'b, T1, T2, U, N: Dim, G: Dim> VersorMul<&'b UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocBlade<N, G> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G: Dim> VersorMul<&'b UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocBlade<N, G> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G: Dim> VersorMul<&'b UnitBlade<T2, N, G>> for &'a Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocBlade<N, G> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G: Dim> VersorMul<&'b UnitBlade<T2, N, G>> for &'a Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocBlade<N, G> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<&'b UnitBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<&'b UnitBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<&'b UnitBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<&'b UnitBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G: Dim> VersorMul<&'b Versor<T2, N>> for UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'b, T1, T2, U, N: Dim, G: Dim> VersorMul<&'b Versor<T2, N>> for UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G: Dim> VersorMul<&'b Versor<T2, N>> for &'a UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, 'b, T1, T2, U, N: Dim, G: Dim> VersorMul<&'b Versor<T2, N>> for &'a UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<Blade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<Blade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<Blade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<Blade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<T1, T2, U, N: Dim, G1: Dim> VersorMul<Multivector<T2, N>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocMultivector<N>,
U: AllocMultivector<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<T1, T2, U, N: Dim, G1: Dim> VersorMul<Multivector<T2, N>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocMultivector<N>,
U: AllocMultivector<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
type Output = Multivector<U, N>
impl<'a, T1, T2, U, N: Dim, G1: Dim> VersorMul<Multivector<T2, N>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocMultivector<N>,
U: AllocMultivector<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G1: Dim> VersorMul<Multivector<T2, N>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocMultivector<N>,
U: AllocMultivector<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
type Output = Multivector<U, N>
impl<T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<SimpleBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<SimpleBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
type Output = SimpleBlade<U, N, G2>
impl<'a, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<SimpleBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<SimpleBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
type Output = SimpleBlade<U, N, G2>
impl<T1, T2, U, N: Dim, G: Dim> VersorMul<UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocBlade<N, G> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<T1, T2, U, N: Dim, G: Dim> VersorMul<UnitBlade<T2, N, G>> for Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocBlade<N, G> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G: Dim> VersorMul<UnitBlade<T2, N, G>> for &'a Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocBlade<N, G> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G: Dim> VersorMul<UnitBlade<T2, N, G>> for &'a Versor<T1, N> where
T1: AllocVersor<N> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G>,
U: AllocBlade<N, G> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<UnitBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<UnitBlade<T2, N, G2>> for UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<UnitBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G1: Dim, G2: Dim> VersorMul<UnitBlade<T2, N, G2>> for &'a UnitBlade<T1, N, G1> where
T1: AllocBlade<N, G1> + AllRefMul<T2, AllOutput = U>,
T2: AllocBlade<N, G2>,
U: AllocBlade<N, G2> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<T1, T2, U, N: Dim, G: Dim> VersorMul<Versor<T2, N>> for UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<T1, T2, U, N: Dim, G: Dim> VersorMul<Versor<T2, N>> for UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G: Dim> VersorMul<Versor<T2, N>> for &'a UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
impl<'a, T1, T2, U, N: Dim, G: Dim> VersorMul<Versor<T2, N>> for &'a UnitBlade<T1, N, G> where
T1: AllocBlade<N, G> + AllRefMul<T2, AllOutput = U>,
T2: AllocVersor<N>,
U: AllocVersor<N> + for<'c> Mul<&'c T1, Output = U> + AddGroup,
Auto Trait Implementations
impl<T, N, G> RefUnwindSafe for UnitBlade<T, N, G> where
<T as AllocBlade<N, G>>::Buffer: RefUnwindSafe,
impl<T, N, G> Send for UnitBlade<T, N, G> where
<T as AllocBlade<N, G>>::Buffer: Send,
impl<T, N, G> Sync for UnitBlade<T, N, G> where
<T as AllocBlade<N, G>>::Buffer: Sync,
impl<T, N, G> Unpin for UnitBlade<T, N, G> where
<T as AllocBlade<N, G>>::Buffer: Unpin,
impl<T, N, G> UnwindSafe for UnitBlade<T, N, G> where
<T as AllocBlade<N, G>>::Buffer: UnwindSafe,
Blanket Implementations
type AllOutput = U
type AllOutput = U
type AllOutput = U
type AllOutput = U
type Buffer = DynBladeStorage<T, Const<N>, Dynamic>
type Buffer = DynBladeStorage<T, Dynamic, Const<G>>
type Buffer = DynBladeStorage<T, Dynamic, Dynamic>
type Buffer = DynMultivectorStorage<T, Dynamic>
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
pub fn is_in_subset(&self) -> bool
pub fn is_in_subset(&self) -> bool
Checks if self
is actually part of its subset T
(and can be converted to it).
pub fn to_subset_unchecked(&self) -> SS
pub fn to_subset_unchecked(&self) -> SS
Use with care! Same as self.to_subset
but without any property checks. Always succeeds.
pub fn from_subset(element: &SS) -> SP
pub fn from_subset(element: &SS) -> SP
The inclusion map: converts self
to the equivalent element of its superset.