farm-ng-core
group_accessors.h
Go to the documentation of this file.
1 // Copyright (c) 2011, Hauke Strasdat
2 // Copyright (c) 2012, Steven Lovegrove
3 // Copyright (c) 2021, farm-ng, inc.
4 //
5 // Use of this source code is governed by an MIT-style
6 // license that can be found in the LICENSE file or at
7 // https://opensource.org/licenses/MIT.
8 
9 #pragma once
11 
12 namespace sophus {
13 
14 template <class TT>
15 class Complex;
16 
17 template <class TT>
18 class Quaternion;
19 
20 namespace concepts {
21 
22 namespace accessors {
23 
24 template <class TT>
25 concept Translation = LieGroup<TT> &&
26  ConstructibleFrom<TT, typename TT::Point> && requires(TT g) {
27  { g.translation() } -> ConvertibleTo<typename TT::Point>;
28 };
29 
30 template <class TT>
31 concept Rotation = LieGroup<TT> && requires(
32  TT g,
33  Eigen::Matrix<typename TT::Scalar, TT::kPointDim, TT::kPointDim> matrix) {
34  { TT::fromRotationMatrix(matrix) } -> ConvertibleTo<TT>;
35  {
36  g.rotationMatrix()
37  } -> ConvertibleTo<
38  Eigen::Matrix<typename TT::Scalar, TT::kPointDim, TT::kPointDim>>;
39 };
40 
41 template <class TT>
42 concept TxTy = requires(typename TT::Scalar s) {
43  { TT::fromT(s, s) } -> ConvertibleTo<TT>;
44  { TT::fromTx(s) } -> ConvertibleTo<TT>;
45  { TT::fromTy(s) } -> ConvertibleTo<TT>;
46 };
47 
48 template <class TT>
49 concept TxTyTz = requires(typename TT::Scalar s) {
50  { TT::fromT(s, s, s) } -> ConvertibleTo<TT>;
51  { TT::fromTx(s) } -> ConvertibleTo<TT>;
52  { TT::fromTy(s) } -> ConvertibleTo<TT>;
53  { TT::fromTz(s) } -> ConvertibleTo<TT>;
54 };
55 
56 template <class TT>
57 concept Isometry = LieGroup<TT> && Translation<TT> &&
58  ConstructibleFrom<TT, typename TT::Rotation> &&
59  ConstructibleFrom<TT, typename TT::Point, typename TT::Rotation> &&
60  requires(TT g, typename TT::Rotation rotation) {
61  { g.rotation() } -> ConvertibleTo<typename TT::Rotation>;
62  {g.setRotation(rotation)};
63 };
64 
65 template <class TT>
66 concept Similarity = LieGroup<TT> && Translation<TT> &&
67  ConstructibleFrom<TT, typename TT::Isometry> && ConstructibleFrom<
68  TT,
69  typename TT::Point,
70  typename TT::Rotation,
71  typename TT::Scalar> &&
72  ConstructibleFrom<TT, typename TT::SpiralSimilarity> &&
73  ConstructibleFrom<TT, typename TT::Point, typename TT::SpiralSimilarity>;
74 
75 template <class TT>
76 concept SpiralSimilarity = Rotation<TT> &&
77  ConstructibleFrom<TT, typename TT::Rotation> &&
78  ConstructibleFrom<TT, typename TT::Rotation, typename TT::Scalar> &&
79  requires(TT g, typename TT::Scalar scale, typename TT::Rotation rotation) {
80  { TT::fromScale(scale) } -> ConvertibleTo<TT>;
81  { g.rotation() } -> ConvertibleTo<typename TT::Rotation>;
82  {g.setRotation(rotation)};
83  { g.scale() } -> ConvertibleTo<typename TT::Scalar>;
84  {g.setScale(scale)};
85 };
86 
87 template <class TT>
88 concept UnitComplex =
89  requires(TT g, typename TT::Scalar s, Complex<typename TT::Scalar> z) {
90  { TT::fitFromComplex(z) } -> ConvertibleTo<TT>;
91  { TT::fromUnitComplex(z) } -> ConvertibleTo<TT>;
92  { g.unitComplex() } -> ConvertibleTo<Complex<typename TT::Scalar>>;
93  {g.setUnitComplex(z)};
94 };
95 
96 template <class TT>
97 concept UnitQuaternion =
98  requires(TT g, typename TT::Scalar s, Quaternion<typename TT::Scalar> q) {
99  { TT::fitFromQuaternion(q) } -> ConvertibleTo<TT>;
100  { TT::fromUnitQuaternion(q) } -> ConvertibleTo<TT>;
101  { g.unitQuaternion() } -> ConvertibleTo<Quaternion<typename TT::Scalar>>;
102  {g.setUnitQuaternion(q)};
103 };
104 
105 template <class TT>
106 concept Rotation2 = Rotation<TT> &&
107  requires(TT g, typename TT::Scalar s, Complex<typename TT::Scalar> z) {
108  { TT::fromAngle(s) } -> ConvertibleTo<TT>;
109  { g.angle() } -> ConvertibleTo<typename TT::Scalar>;
110 };
111 
112 template <class TT>
113 concept Rotation3 = Rotation<TT> &&
114  requires(TT g, typename TT::Scalar s, Quaternion<typename TT::Scalar> q) {
115  { TT::fromRx(s) } -> ConvertibleTo<TT>;
116  { TT::fromRy(s) } -> ConvertibleTo<TT>;
117  { TT::fromRz(s) } -> ConvertibleTo<TT>;
118 };
119 
120 template <class TT>
121 concept Isometry2 = Isometry<TT> && Rotation2<TT> && TxTy<TT>;
122 
123 template <class TT>
124 concept Isometry3 = Isometry<TT> && Rotation3<TT> && TxTyTz<TT>;
125 
126 template <class TT>
127 concept SpiralSimilarity2 = Rotation2<TT> && SpiralSimilarity<TT> &&
128  requires(TT g, Complex<typename TT::Scalar> z) {
129  { TT::fromComplex(z) } -> ConvertibleTo<TT>;
130  { g.complex() } -> ConvertibleTo<Complex<typename TT::Scalar>>;
131  {g.setComplex(z)};
132 };
133 
134 template <class TT>
135 concept SpiralSimilarity3 = Rotation3<TT> && SpiralSimilarity<TT> &&
136  requires(TT g, Quaternion<typename TT::Scalar> q) {
137  { TT::fromQuaternion(q) } -> ConvertibleTo<TT>;
138  { g.quaternion() } -> ConvertibleTo<Quaternion<typename TT::Scalar>>;
139  {g.setQuaternion(q)};
140 };
141 
142 template <class TT>
143 concept Similarity2 = Similarity<TT> && SpiralSimilarity2<TT> && TxTy<TT>;
144 
145 template <class TT>
146 concept Similarity3 = Similarity<TT> && SpiralSimilarity3<TT> && TxTyTz<TT>;
147 
148 } // namespace accessors
149 
150 namespace base {
151 
152 template <class TT>
153 concept Rotation = LieGroup<TT> && requires(
154  TT g,
155  Eigen::Matrix<typename TT::Scalar, TT::kPointDim, TT::kPointDim> matrix) {
156  { TT::fitFromMatrix(matrix) } -> ConvertibleTo<TT>;
157 };
158 
159 } // namespace base
160 
161 template <class TT>
162 concept Rotation2 =
163  base::Rotation<TT> && ConstructibleFrom<TT, typename TT::Scalar> &&
164  accessors::Rotation2<TT> && accessors::UnitComplex<TT>;
165 
166 template <class TT>
167 concept Rotation3 = base::Rotation<TT> && accessors::Rotation3<TT> &&
168  accessors::UnitQuaternion<TT>;
169 
170 template <class TT>
171 concept SpiralSimilarity2 = accessors::SpiralSimilarity2<TT>;
172 
173 template <class TT>
174 concept SpiralSimilarity3 = accessors::SpiralSimilarity3<TT>;
175 
176 template <class TT>
177 concept Isometry2 = accessors::Isometry2<TT> && accessors::Rotation2<TT> &&
178  accessors::UnitComplex<TT>;
179 
180 template <class TT>
181 concept Isometry3 = accessors::Isometry3<TT> && accessors::Rotation3<TT> &&
182  accessors::UnitQuaternion<TT>;
183 
184 template <class TT>
185 concept Similarity2 =
186  accessors::Similarity<TT> && accessors::SpiralSimilarity2<TT>;
187 
188 template <class TT>
189 concept Similarity3 =
190  accessors::Similarity<TT> && accessors::SpiralSimilarity3<TT>;
191 
192 template <class TT>
193 concept Translation = accessors::Translation<TT>;
194 
195 } // namespace concepts
196 } // namespace sophus
lie_group.h
sophus::Similarity2
Definition: similarity2.h:22
sophus::concepts::accessors::SpiralSimilarity
concept SpiralSimilarity
Definition: group_accessors.h:76
sophus::Translation
Definition: translation.h:19
sophus::Rotation3
Definition: rotation3.h:20
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::concepts::accessors::Rotation
concept Rotation
Definition: group_accessors.h:31
sophus::Translation::translation
auto translation() -> Point &
Definition: translation.h:65
sophus::concepts::accessors::Similarity
concept Similarity
Definition: group_accessors.h:66
sophus::concepts::accessors::UnitQuaternion
concept UnitQuaternion
Definition: group_accessors.h:97
sophus::concepts::base::Rotation
concept Rotation
Definition: group_accessors.h:153
sophus::SpiralSimilarity3
Definition: spiral_similarity3.h:20
sophus::concepts::accessors::Isometry
concept Isometry
Definition: group_accessors.h:57
sophus::concepts::ConstructibleFrom
concept ConstructibleFrom
Definition: utils.h:38
sophus::Rotation2::angle
auto angle() const -> TScalar
Definition: rotation2.h:80
sophus::Isometry2
Definition: isometry2.h:22
sophus::SpiralSimilarity2
Definition: spiral_similarity2.h:20
sophus::concepts::accessors::TxTy
concept TxTy
Definition: group_accessors.h:42
sophus::Rotation2
Definition: rotation2.h:20
sophus::concepts::accessors::UnitComplex
concept UnitComplex
Definition: group_accessors.h:88
sophus::Isometry3
Definition: isometry3.h:22
sophus::Similarity3
Definition: similarity3.h:22
sophus::Complex
Definition: group_accessors.h:15
sophus::concepts::ConvertibleTo
concept ConvertibleTo
Definition: utils.h:33
sophus::concepts::accessors::TxTyTz
concept TxTyTz
Definition: group_accessors.h:49
sophus::Quaternion
Definition: group_accessors.h:18