IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
Similarity3d.h
1 // Similarity3d.h:
3 // ---------------
4 //
14 
15 #ifndef __IPSDKMATH_SIMILARITY3D_H__
16 #define __IPSDKMATH_SIMILARITY3D_H__
17 
18 // suppression warnings
19 // warning C4251: 'ipsdk::math::transform::Similarity3d::g_registrator' : struct 'ipsdk::math::transform::Registrator<ipsdk::math::transform::Similarity3d>' needs to have dll-interface to be used by clients of class 'ipsdk::math::transform::Similarity3d'
20 #pragma warning (push)
21 #pragma warning (disable : 4251)
22 
23 #include <IPSDKMath/Geometry/3d/Transform/BaseLinearGeometricTransform3d.h>
25 
26 namespace ipsdk {
27 namespace math {
28 namespace transform {
29 
32 
34 {
35 // predefined public type
36 public:
39 
40  (eTP_Scale)
41  (eTP_Chi)
42  (eTP_Beta)
43  (eTP_Alpha)
44  (eTP_Tx)
45  (eTP_Ty)
46  (eTP_Tz)
47  );
48 
49  // declare geometric transformation 3d
51 
52 public:
55  Similarity3d()
56  {
57  setParams(1, 0, 0, 0, 0, 0, 0);
58  }
59  Similarity3d(const ipReal64 scale,
60  const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha,
61  const ipReal64 tx, const ipReal64 ty, const ipReal64 tz)
62  {
63  setParams(scale, chi, beta, alpha, tx, ty, tz);
64  }
65  ~Similarity3d() {}
67 
68 // methods
69 public:
72  static void transform(const ipReal64 scale,
73  const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha,
74  const ipReal64 tx, const ipReal64 ty, const ipReal64 tz,
75  ipReal64& x, ipReal64& y, ipReal64& z)
76  {
77  transform(scale,
78  std::cos(chi), std::sin(chi),
79  std::cos(beta), std::sin(beta),
80  std::cos(alpha), std::sin(alpha),
81  tx, ty, tz,
82  x, y, z);
83  }
84  static void transform(const ipReal64 scale,
85  const ipReal64 cosChi, const ipReal64 sinChi,
86  const ipReal64 cosBeta, const ipReal64 sinBeta,
87  const ipReal64 cosAlpha, const ipReal64 sinAlpha,
88  const ipReal64 tx, const ipReal64 ty, const ipReal64 tz,
89  ipReal64& x, ipReal64& y, ipReal64& z)
90  {
91  rotate3dInSitu(cosChi, sinChi, cosBeta, sinBeta, cosAlpha, sinAlpha, x, y, z);
92  x *= scale;
93  y *= scale;
94  z *= scale;
95  x += tx;
96  y += ty;
97  z += tz;
98  }
100 
103  static Matrix4d getHomogenousMatrix(const ipReal64 scale,
104  const ipReal64 chi,
105  const ipReal64 beta,
106  const ipReal64 alpha,
107  const ipReal64 tx,
108  const ipReal64 ty,
109  const ipReal64 tz)
110  {
111  return getHomogenousMatrix(scale,
112  std::cos(chi), std::sin(chi),
113  std::cos(beta), std::sin(beta),
114  std::cos(alpha), std::sin(alpha),
115  tx, ty, tz);
116  }
117  static Matrix4d getHomogenousMatrix(const ipReal64 scale,
118  const ipReal64 cosChi, const ipReal64 sinChi,
119  const ipReal64 cosBeta, const ipReal64 sinBeta,
120  const ipReal64 cosAlpha, const ipReal64 sinAlpha,
121  const ipReal64 tx, const ipReal64 ty, const ipReal64 tz)
122  {
123  Matrix4d transform;
124  eulerToMatrix(cosChi, sinChi, cosBeta, sinBeta, cosAlpha, sinAlpha,
125  transform(0, 0), transform(0, 1), transform(0, 2),
126  transform(1, 0), transform(1, 1), transform(1, 2),
127  transform(2, 0), transform(2, 1), transform(2, 2));
128  transform(0, 0) *= scale;
129  transform(0, 1) *= scale;
130  transform(0, 2) *= scale;
131  transform(1, 0) *= scale;
132  transform(1, 1) *= scale;
133  transform(1, 2) *= scale;
134  transform(2, 0) *= scale;
135  transform(2, 1) *= scale;
136  transform(2, 2) *= scale;
137  transform(0, 3) = tx;
138  transform(1, 3) = ty;
139  transform(2, 3) = tz;
140  transform(3, 0) = 0; transform(3, 1) = 0; transform(3, 2) = 0; transform(3, 3) = 1;
141 
142  return transform;
143  }
145 
147  static Matrix4d getInvHomogenousMatrix(const ipReal64 scale,
148  const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha,
149  const ipReal64 tx, const ipReal64 ty, const ipReal64 tz)
150  {
151  // invert input parameters
152  ipReal64 invScale = scale;
153  ipReal64 invChi= chi;
154  ipReal64 invBeta = beta;
155  ipReal64 invAlpha = alpha;
156  ipReal64 invTx = tx;
157  ipReal64 invTy = ty;
158  ipReal64 invTz = tz;
159  getInvParams(invScale, invChi, invBeta, invAlpha, invTx, invTy, invTz);
160 
161  return getHomogenousMatrix(invScale, invChi, invBeta, invAlpha, invTx, invTy, invTz);
162  }
163 
165  static void getInvParams(ipReal64& scale,
166  ipReal64& chi, ipReal64& beta, ipReal64& alpha,
167  ipReal64& tx, ipReal64& ty, ipReal64& tz);
168 
170  static Vector getIdentityParams();
171 
173  void setParams(const ipReal64 scale,
174  const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha,
175  const ipReal64 tx, const ipReal64 ty, const ipReal64 tz)
176  {
177  _scale = scale;
178  _chi = chi;
179  _cosChi = std::cos(_chi);
180  _sinChi = std::sin(_chi);
181  _beta = beta;
182  _cosBeta = std::cos(_beta);
183  _sinBeta = std::sin(_beta);
184  _alpha = alpha;
185  _cosAlpha = std::cos(_alpha);
186  _sinAlpha = std::sin(_alpha);
187  _tx = tx;
188  _ty = ty;
189  _tz = tz;
190  }
191 
195  void setParams(const Vector& params);
196 
198  void setIdentity();
199 
201  void apply(ipReal64& x, ipReal64& y, ipReal64& z) const;
202 
204  Matrix4d getHomogenousMatrix() const;
205 
207  Vector getParams() const;
208 
211  ipReal64 getScale() const;
212  ipReal64 getChi() const;
213  ipReal64 getBeta() const;
214  ipReal64 getAlpha() const;
215  ipReal64 getTx() const;
216  ipReal64 getTy() const;
217  ipReal64 getTz() const;
219 
221  Matrix4d getInvHomogenousMatrix() const;
222 
224  Vector getInvParams() const;
225 
226 // attributes
227 protected:
229  ipReal64 _scale;
230 
233  ipReal64 _chi;
234  ipReal64 _beta;
235  ipReal64 _alpha;
237 
240  ipReal64 _cosChi;
241  ipReal64 _sinChi;
242  ipReal64 _cosBeta;
243  ipReal64 _sinBeta;
244  ipReal64 _cosAlpha;
245  ipReal64 _sinAlpha;
247 
249  ipReal64 _tx;
252  ipReal64 _ty;
255  ipReal64 _tz;
256 };
257 
260 
261 inline ipReal64
263 {
264  return _scale;
265 }
266 
267 inline ipReal64
268 Similarity3d::getChi() const
269 {
270  return _chi;
271 }
272 
273 inline ipReal64
274 Similarity3d::getBeta() const
275 {
276  return _beta;
277 }
278 
279 inline ipReal64
281 {
282  return _alpha;
283 }
284 
285 inline ipReal64
286 Similarity3d::getTx() const
287 {
288  return _tx;
289 }
290 
291 inline ipReal64
292 Similarity3d::getTy() const
293 {
294  return _ty;
295 }
296 
297 inline ipReal64
298 Similarity3d::getTz() const
299 {
300  return _tz;
301 }
302 
303 inline void
305 {
307 }
308 
311 
312 } // end of namespace transform
313 } // end of namespace math
314 } // end of namespace ipsdk
315 
316 #pragma warning (pop)
317 
318 #endif // __IPSDKMATH_SIMILARITY3D_H__
ipReal64 getBeta() const
retrieve parameters associated to transformation
Definition: Similarity3d.h:283
ipReal64 _alpha
angles of rotation in radians
Definition: Similarity3d.h:244
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
ipReal64 getTz() const
retrieve parameters associated to transformation
Definition: Similarity3d.h:307
eTransformParams
Definition: Similarity3d.h:40
ipReal64 _tz
translation coordinate along y axis
Definition: Similarity3d.h:264
IPSDK_FORCEINLINE void eulerToMatrix(const T cosChi, const T sinChi, const T cosBeta, const T sinBeta, const T cosAlpha, const T sinAlpha, T &rxx, T &rxy, T &rxz, T &ryx, T &ryy, T &ryz, T &rzx, T &rzy, T &rzz)
Convertion from euler angles to rotation matrix.
Definition: Angles3d.h:99
ipReal64 getChi() const
retrieve parameters associated to transformation
Definition: Similarity3d.h:277
Base class for linear geometric transformation 3d management.
Definition: BaseLinearGeometricTransform3d.h:27
ipReal64 getTy() const
retrieve parameters associated to transformation
Definition: Similarity3d.h:301
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
IPSDKGEOMETRY_API bool apply(const BaseGeometryTransform2d &transform, BaseGeometryEntity2d &entity)
function allowing to apply in situ a given transformation on an entity
#define IPSDK_DECLARE_TRANSFORM3D(className)
macro allowing to declare a geometric transformation 3d
Definition: Transform3dHdrMacros.h:54
boost::numeric::ublas::vector< ipReal64 > Vector
vector type associated to library
Definition: LinearAlgebraTypes.h:36
ipReal64 _beta
angles of rotation in radians
Definition: Similarity3d.h:243
#define IPSDKMATH_API
Import/Export macro for library IPSDKMath.
Definition: IPSDKMathExports.h:27
ipReal64 _chi
angles of rotation in radians
Definition: Similarity3d.h:242
ipReal64 _scale
transformation scale
Definition: Similarity3d.h:238
ipReal64 _tx
translation coordinate along x axis
Definition: Similarity3d.h:258
boost::numeric::ublas::bounded_matrix< ipReal64, 4, 4 > Matrix4d
4d matrix (4x4) type associated to library
Definition: LinearAlgebraTypes.h:57
Transformation class allowing to manage 3d similarity transformations.
Definition: Similarity3d.h:33
ipReal64 getScale() const
retrieve parameters associated to transformation
Definition: Similarity3d.h:271
Utility functions used to handle angles 3d.
ipReal64 _ty
translation coordinate along y axis
Definition: Similarity3d.h:261
void setIdentity()
set transformation parameters to identity
Definition: Similarity3d.h:313
void setParams(const ipReal64 scale, const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha, const ipReal64 tx, const ipReal64 ty, const ipReal64 tz)
select parameters associated to transformation
Definition: Similarity3d.h:182
ipReal64 getTx() const
retrieve parameters associated to transformation
Definition: Similarity3d.h:295
IPSDK_FORCEINLINE void rotate3dInSitu(const ipReal64 rxx, const ipReal64 rxy, const ipReal64 rxz, const ipReal64 ryx, const ipReal64 ryy, const ipReal64 ryz, const ipReal64 rzx, const ipReal64 rzy, const ipReal64 rzz, T &x, T &y, T &z)
rotation of a point using a rotation angle (rotation around origin)
Definition: Angles3d.h:227
ipReal64 getAlpha() const
retrieve parameters associated to transformation
Definition: Similarity3d.h:289
static Vector getIdentityParams()
retrieve identity parameters for transformation
#define IPSDK_ENUM(enumTypeStr, enumSeq)
macro allowing to declare an enumerate for library
Definition: EnumMacros.h:26