IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
Rigid3d.h
1 // Rigid3d.h:
3 // ----------
4 //
14 
15 #ifndef __IPSDKMATH_RIGID3D_H__
16 #define __IPSDKMATH_RIGID3D_H__
17 
18 // suppression warnings
19 // warning C4251: 'ipsdk::math::transform::Rigid3d::g_registrator' : struct 'ipsdk::math::transform::Registrator<ipsdk::math::transform::Rigid3d>' needs to have dll-interface to be used by clients of class 'ipsdk::math::transform::Rigid3d'
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_Chi)
41  (eTP_Beta)
42  (eTP_Alpha)
43  (eTP_Tx)
44  (eTP_Ty)
45  (eTP_Tz)
46  );
47 
48  // declare geometric transformation 3d
50 
51 public:
54  Rigid3d()
55  {
56  setParams(0, 0, 0, 0, 0, 0);
57  }
58  Rigid3d(const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha,
59  const ipReal64 tx, const ipReal64 ty, const ipReal64 tz)
60  {
61  setParams(chi, beta, alpha, tx, ty, tz);
62  }
63  ~Rigid3d() {}
65 
66 // methods
67 public:
70  static void transform(const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha,
71  const ipReal64 tx, const ipReal64 ty, const ipReal64 tz,
72  ipReal64& x, ipReal64& y, ipReal64& z)
73  {
74  transform(std::cos(chi), std::sin(chi),
75  std::cos(beta), std::sin(beta),
76  std::cos(alpha), std::sin(alpha),
77  tx, ty, tz,
78  x, y, z);
79  }
80  static void transform(const ipReal64 cosChi, const ipReal64 sinChi,
81  const ipReal64 cosBeta, const ipReal64 sinBeta,
82  const ipReal64 cosAlpha, const ipReal64 sinAlpha,
83  const ipReal64 tx, const ipReal64 ty, const ipReal64 tz,
84  ipReal64& x, ipReal64& y, ipReal64& z)
85  {
86  rotate3dInSitu(cosChi, sinChi, cosBeta, sinBeta, cosAlpha, sinAlpha, x, y, z);
87  x += tx;
88  y += ty;
89  z += tz;
90  }
92 
95  static Matrix4d getHomogenousMatrix(const ipReal64 chi,
96  const ipReal64 beta,
97  const ipReal64 alpha,
98  const ipReal64 tx,
99  const ipReal64 ty,
100  const ipReal64 tz)
101  {
102  return getHomogenousMatrix(std::cos(chi), std::sin(chi),
103  std::cos(beta), std::sin(beta),
104  std::cos(alpha), std::sin(alpha),
105  tx, ty, tz);
106  }
107  static Matrix4d getHomogenousMatrix(const ipReal64 cosChi, const ipReal64 sinChi,
108  const ipReal64 cosBeta, const ipReal64 sinBeta,
109  const ipReal64 cosAlpha, const ipReal64 sinAlpha,
110  const ipReal64 tx, const ipReal64 ty, const ipReal64 tz)
111  {
112  Matrix4d transform;
113  eulerToMatrix(cosChi, sinChi, cosBeta, sinBeta, cosAlpha, sinAlpha,
114  transform(0, 0), transform(0, 1), transform(0, 2),
115  transform(1, 0), transform(1, 1), transform(1, 2),
116  transform(2, 0), transform(2, 1), transform(2, 2));
117  transform(0, 3) = tx;
118  transform(1, 3) = ty;
119  transform(2, 3) = tz;
120  transform(3, 0) = 0; transform(3, 1) = 0; transform(3, 2) = 0; transform(3, 3) = 1;
121 
122  return transform;
123  }
125 
127  static Matrix4d getInvHomogenousMatrix(const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha,
128  const ipReal64 tx, const ipReal64 ty, const ipReal64 tz)
129  {
130  // invert input parameters
131  ipReal64 invChi= chi;
132  ipReal64 invBeta = beta;
133  ipReal64 invAlpha = alpha;
134  ipReal64 invTx = tx;
135  ipReal64 invTy = ty;
136  ipReal64 invTz = tz;
137  getInvParams(invChi, invBeta, invAlpha, invTx, invTy, invTz);
138 
139  return getHomogenousMatrix(invChi, invBeta, invAlpha, invTx, invTy, invTz);
140  }
141 
143  static void getInvParams(ipReal64& chi, ipReal64& beta, ipReal64& alpha,
144  ipReal64& tx, ipReal64& ty, ipReal64& tz);
145 
147  static Vector getIdentityParams();
148 
150  void setParams(const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha,
151  const ipReal64 tx, const ipReal64 ty, const ipReal64 tz)
152  {
153  _chi = chi;
154  _cosChi = std::cos(_chi);
155  _sinChi = std::sin(_chi);
156  _beta = beta;
157  _cosBeta = std::cos(_beta);
158  _sinBeta = std::sin(_beta);
159  _alpha = alpha;
160  _cosAlpha = std::cos(_alpha);
161  _sinAlpha = std::sin(_alpha);
162  _tx = tx;
163  _ty = ty;
164  _tz = tz;
165  }
166 
168  void setCenteredRotation(const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha,
169  const ipReal64 centerX, const ipReal64 centerY, const ipReal64 centerZ)
170  {
171  // store angle informations
172  _chi = chi;
173  _cosChi = std::cos(_chi);
174  _sinChi = std::sin(_chi);
175  _beta = beta;
176  _cosBeta = std::cos(_beta);
177  _sinBeta = std::sin(_beta);
178  _alpha = alpha;
179  _cosAlpha = std::cos(_alpha);
180  _sinAlpha = std::sin(_alpha);
181 
182  // we compute translation such as center point is invariant
183  // (ie C = RxC + T => T = C - RxC)
184  ipReal64 rx, ry, rz;
185  rotate3d<ipReal64>(centerX, centerY, centerZ,
186  _cosChi, _sinChi, _cosBeta, _sinBeta, _cosAlpha, _sinAlpha,
187  rx, ry, rz);
188  _tx = centerX - rx;
189  _ty = centerY - ry;
190  _tz = centerZ - rz;
191  }
192 
196  void setParams(const Vector& params);
197 
199  void setIdentity();
200 
202  void apply(ipReal64& x, ipReal64& y, ipReal64& z) const;
203 
205  Matrix4d getHomogenousMatrix() const;
206 
208  Vector getParams() const;
209 
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:
230  ipReal64 _chi;
231  ipReal64 _beta;
232  ipReal64 _alpha;
234 
237  ipReal64 _cosChi;
238  ipReal64 _sinChi;
239  ipReal64 _cosBeta;
240  ipReal64 _sinBeta;
241  ipReal64 _cosAlpha;
242  ipReal64 _sinAlpha;
244 
246  ipReal64 _tx;
249  ipReal64 _ty;
252  ipReal64 _tz;
253 };
258 inline ipReal64
259 Rigid3d::getChi() const
260 {
261  return _chi;
262 }
263 
264 inline ipReal64
265 Rigid3d::getBeta() const
266 {
267  return _beta;
268 }
269 
270 inline ipReal64
271 Rigid3d::getAlpha() const
272 {
273  return _alpha;
274 }
275 
276 inline ipReal64
277 Rigid3d::getTx() const
278 {
279  return _tx;
280 }
281 
282 inline ipReal64
283 Rigid3d::getTy() const
284 {
285  return _ty;
286 }
287 
288 inline ipReal64
289 Rigid3d::getTz() const
290 {
291  return _tz;
292 }
293 
294 inline void
296 {
298 }
299 
302 
303 } // end of namespace transform
304 } // end of namespace math
305 } // end of namespace ipsdk
306 
307 #pragma warning (pop)
308 
309 #endif // __IPSDKMATH_RIGID3D_H__
ipReal64 getTx() const
retrieve parameters associated to transformation
Definition: Rigid3d.h:285
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
ipReal64 getTz() const
retrieve parameters associated to transformation
Definition: Rigid3d.h:297
eTransformParams
Definition: Rigid3d.h:40
ipReal64 getTy() const
retrieve parameters associated to transformation
Definition: Rigid3d.h:291
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 _alpha
angles of rotation in radians
Definition: Rigid3d.h:240
Base class for linear geometric transformation 3d management.
Definition: BaseLinearGeometricTransform3d.h:27
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
ipReal64 getChi() const
retrieve parameters associated to transformation
Definition: Rigid3d.h:267
#define IPSDK_DECLARE_TRANSFORM3D(className)
macro allowing to declare a geometric transformation 3d
Definition: Transform3dHdrMacros.h:54
ipReal64 getAlpha() const
retrieve parameters associated to transformation
Definition: Rigid3d.h:279
boost::numeric::ublas::vector< ipReal64 > Vector
vector type associated to library
Definition: LinearAlgebraTypes.h:36
void setParams(const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha, const ipReal64 tx, const ipReal64 ty, const ipReal64 tz)
select parameters associated to transformation
Definition: Rigid3d.h:158
#define IPSDKMATH_API
Import/Export macro for library IPSDKMath.
Definition: IPSDKMathExports.h:27
boost::numeric::ublas::bounded_matrix< ipReal64, 4, 4 > Matrix4d
4d matrix (4x4) type associated to library
Definition: LinearAlgebraTypes.h:57
ipReal64 _tz
translation coordinate along y axis
Definition: Rigid3d.h:260
ipReal64 _beta
angles of rotation in radians
Definition: Rigid3d.h:239
Transformation class allowing to manage 3d rigid transformations.
Definition: Rigid3d.h:33
Utility functions used to handle angles 3d.
ipReal64 _chi
angles of rotation in radians
Definition: Rigid3d.h:238
ipReal64 getBeta() const
retrieve parameters associated to transformation
Definition: Rigid3d.h:273
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 _ty
translation coordinate along y axis
Definition: Rigid3d.h:257
void setIdentity()
set transformation parameters to identity
Definition: Rigid3d.h:303
ipReal64 _tx
translation coordinate along x axis
Definition: Rigid3d.h:254
#define IPSDK_ENUM(enumTypeStr, enumSeq)
macro allowing to declare an enumerate for library
Definition: EnumMacros.h:26
static Vector getIdentityParams()
retrieve identity parameters for transformation