nalgebra/geometry/
abstract_rotation.rs1use crate::geometry::{Rotation, UnitComplex, UnitQuaternion};
2use crate::{Const, OVector, Point, SVector, Scalar, SimdRealField, Unit};
3
4use simba::scalar::ClosedMulAssign;
5
6pub trait AbstractRotation<T: Scalar, const D: usize>: PartialEq + ClosedMulAssign + Clone {
8 fn identity() -> Self;
10 fn inverse(&self) -> Self;
12 fn inverse_mut(&mut self);
14 fn transform_vector(&self, v: &SVector<T, D>) -> SVector<T, D>;
16 fn transform_point(&self, p: &Point<T, D>) -> Point<T, D>;
18 fn inverse_transform_vector(&self, v: &OVector<T, Const<D>>) -> OVector<T, Const<D>>;
20 fn inverse_transform_unit_vector(&self, v: &Unit<SVector<T, D>>) -> Unit<SVector<T, D>> {
22 Unit::new_unchecked(self.inverse_transform_vector(&**v))
23 }
24 fn inverse_transform_point(&self, p: &Point<T, D>) -> Point<T, D>;
26}
27
28impl<T: SimdRealField, const D: usize> AbstractRotation<T, D> for Rotation<T, D>
29where
30 T::Element: SimdRealField,
31{
32 #[inline]
33 fn identity() -> Self {
34 Self::identity()
35 }
36
37 #[inline]
38 fn inverse(&self) -> Self {
39 self.inverse()
40 }
41
42 #[inline]
43 fn inverse_mut(&mut self) {
44 self.inverse_mut()
45 }
46
47 #[inline]
48 fn transform_vector(&self, v: &SVector<T, D>) -> SVector<T, D> {
49 self * v
50 }
51
52 #[inline]
53 fn transform_point(&self, p: &Point<T, D>) -> Point<T, D> {
54 self * p
55 }
56
57 #[inline]
58 fn inverse_transform_vector(&self, v: &SVector<T, D>) -> SVector<T, D> {
59 self.inverse_transform_vector(v)
60 }
61
62 #[inline]
63 fn inverse_transform_unit_vector(&self, v: &Unit<SVector<T, D>>) -> Unit<SVector<T, D>> {
64 self.inverse_transform_unit_vector(v)
65 }
66
67 #[inline]
68 fn inverse_transform_point(&self, p: &Point<T, D>) -> Point<T, D> {
69 self.inverse_transform_point(p)
70 }
71}
72
73impl<T: SimdRealField> AbstractRotation<T, 3> for UnitQuaternion<T>
74where
75 T::Element: SimdRealField,
76{
77 #[inline]
78 fn identity() -> Self {
79 Self::identity()
80 }
81
82 #[inline]
83 fn inverse(&self) -> Self {
84 self.inverse()
85 }
86
87 #[inline]
88 fn inverse_mut(&mut self) {
89 self.inverse_mut()
90 }
91
92 #[inline]
93 fn transform_vector(&self, v: &SVector<T, 3>) -> SVector<T, 3> {
94 self * v
95 }
96
97 #[inline]
98 fn transform_point(&self, p: &Point<T, 3>) -> Point<T, 3> {
99 self * p
100 }
101
102 #[inline]
103 fn inverse_transform_vector(&self, v: &SVector<T, 3>) -> SVector<T, 3> {
104 self.inverse_transform_vector(v)
105 }
106
107 #[inline]
108 fn inverse_transform_point(&self, p: &Point<T, 3>) -> Point<T, 3> {
109 self.inverse_transform_point(p)
110 }
111}
112
113impl<T: SimdRealField> AbstractRotation<T, 2> for UnitComplex<T>
114where
115 T::Element: SimdRealField,
116{
117 #[inline]
118 fn identity() -> Self {
119 Self::identity()
120 }
121
122 #[inline]
123 fn inverse(&self) -> Self {
124 self.inverse()
125 }
126
127 #[inline]
128 fn inverse_mut(&mut self) {
129 self.inverse_mut()
130 }
131
132 #[inline]
133 fn transform_vector(&self, v: &SVector<T, 2>) -> SVector<T, 2> {
134 self * v
135 }
136
137 #[inline]
138 fn transform_point(&self, p: &Point<T, 2>) -> Point<T, 2> {
139 self * p
140 }
141
142 #[inline]
143 fn inverse_transform_vector(&self, v: &SVector<T, 2>) -> SVector<T, 2> {
144 self.inverse_transform_vector(v)
145 }
146
147 #[inline]
148 fn inverse_transform_point(&self, p: &Point<T, 2>) -> Point<T, 2> {
149 self.inverse_transform_point(p)
150 }
151}