IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
Rotation3d.h
1 // Rotation3d.h:
3 // -------------
4 //
14 
15 #ifndef __IPSDKMATH_ROTATION3D_H__
16 #define __IPSDKMATH_ROTATION3D_H__
17 
18 // suppression warnings
19 // warning C4251: 'ipsdk::math::transform::Rotation3d::g_registrator' : struct 'ipsdk::math::transform::Registrator<ipsdk::math::transform::Rotation3d>' needs to have dll-interface to be used by clients of class 'ipsdk::math::transform::Rotation3d'
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  );
44 
45  // declare geometric transformation 3d
47 
48 public:
51  Rotation3d()
52  {
53  setParams(0, 0, 0);
54  }
55  Rotation3d(const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha)
56  {
57  setParams(chi, beta, alpha);
58  }
59  ~Rotation3d() {}
61 
62 // methods
63 public:
66  static void transform(const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha,
67  ipReal64& x, ipReal64& y, ipReal64& z)
68  {
69  transform(std::cos(chi), std::sin(chi),
70  std::cos(beta), std::sin(beta),
71  std::cos(alpha), std::sin(alpha),
72  x, y, z);
73  }
74  static void transform(const ipReal64 cosChi, const ipReal64 sinChi,
75  const ipReal64 cosBeta, const ipReal64 sinBeta,
76  const ipReal64 cosAlpha, const ipReal64 sinAlpha,
77  ipReal64& x, ipReal64& y, ipReal64& z)
78  {
79  rotate3dInSitu(cosChi, sinChi, cosBeta, sinBeta, cosAlpha, sinAlpha, x, y, z);
80  }
82 
85  static Matrix4d getHomogenousMatrix(const ipReal64 chi,
86  const ipReal64 beta,
87  const ipReal64 alpha)
88  {
89  return getHomogenousMatrix(std::cos(chi), std::sin(chi),
90  std::cos(beta), std::sin(beta),
91  std::cos(alpha), std::sin(alpha));
92  }
93  static Matrix4d getHomogenousMatrix(const ipReal64 cosChi, const ipReal64 sinChi,
94  const ipReal64 cosBeta, const ipReal64 sinBeta,
95  const ipReal64 cosAlpha, const ipReal64 sinAlpha)
96  {
97  Matrix4d transform;
98  eulerToMatrix(cosChi, sinChi, cosBeta, sinBeta, cosAlpha, sinAlpha,
99  transform(0, 0), transform(0, 1), transform(0, 2),
100  transform(1, 0), transform(1, 1), transform(1, 2),
101  transform(2, 0), transform(2, 1), transform(2, 2));
102  transform(0, 3) = 0;
103  transform(1, 3) = 0;
104  transform(2, 3) = 0;
105  transform(3, 0) = 0; transform(3, 1) = 0; transform(3, 2) = 0; transform(3, 3) = 1;
106 
107  return transform;
108  }
110 
112  static Matrix4d getInvHomogenousMatrix(const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha)
113  {
114  // invert input parameters
115  ipReal64 invChi= chi;
116  ipReal64 invBeta = beta;
117  ipReal64 invAlpha = alpha;
118  getInvParams(invChi, invBeta, invAlpha);
119 
120  return getHomogenousMatrix(invChi, invBeta, invAlpha);
121  }
122 
124  static void getInvParams(ipReal64& chi, ipReal64& beta, ipReal64& alpha);
125 
127  static Vector getIdentityParams();
128 
130  void setParams(const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha)
131  {
132  _chi = chi;
133  _cosChi = std::cos(_chi);
134  _sinChi = std::sin(_chi);
135  _beta = beta;
136  _cosBeta = std::cos(_beta);
137  _sinBeta = std::sin(_beta);
138  _alpha = alpha;
139  _cosAlpha = std::cos(_alpha);
140  _sinAlpha = std::sin(_alpha);
141  }
142 
146  void setParams(const Vector& params);
147 
149  void setIdentity();
150 
152  void apply(ipReal64& x, ipReal64& y, ipReal64& z) const;
153 
155  Matrix4d getHomogenousMatrix() const;
156 
158  Vector getParams() const;
159 
162  ipReal64 getChi() const;
163  ipReal64 getBeta() const;
164  ipReal64 getAlpha() const;
166 
168  Matrix4d getInvHomogenousMatrix() const;
169 
171  Vector getInvParams() const;
172 
173 // attributes
174 protected:
177  ipReal64 _chi;
178  ipReal64 _beta;
179  ipReal64 _alpha;
181 
184  ipReal64 _cosChi;
185  ipReal64 _sinChi;
186  ipReal64 _cosBeta;
187  ipReal64 _sinBeta;
188  ipReal64 _cosAlpha;
189  ipReal64 _sinAlpha;
191 };
195 
196 inline ipReal64
197 Rotation3d::getChi() const
198 {
199  return _chi;
200 }
201 
202 inline ipReal64
203 Rotation3d::getBeta() const
204 {
205  return _beta;
206 }
207 
208 inline ipReal64
209 Rotation3d::getAlpha() const
210 {
211  return _alpha;
212 }
213 
214 inline void
216 {
218 }
219 
222 
223 } // end of namespace transform
224 } // end of namespace math
225 } // end of namespace ipsdk
226 
227 #pragma warning (pop)
228 
229 #endif // __IPSDKMATH_ROTATION3D_H__
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
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
void setParams(const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha)
select parameters associated to transformation
Definition: Rotation3d.h:135
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
Transformation class allowing to manage 3d rotation transformations.
Definition: Rotation3d.h:33
#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
#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 _beta
angles of rotation in radians
Definition: Rotation3d.h:183
Utility functions used to handle angles 3d.
ipReal64 _alpha
angles of rotation in radians
Definition: Rotation3d.h:184
void setIdentity()
set transformation parameters to identity
Definition: Rotation3d.h:220
ipReal64 _chi
angles of rotation in radians
Definition: Rotation3d.h:182
static Vector getIdentityParams()
retrieve identity parameters for transformation
ipReal64 getBeta() const
retrieve parameters associated to transformation
Definition: Rotation3d.h:208
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
eTransformParams
Definition: Rotation3d.h:40
#define IPSDK_ENUM(enumTypeStr, enumSeq)
macro allowing to declare an enumerate for library
Definition: EnumMacros.h:26
ipReal64 getAlpha() const
retrieve parameters associated to transformation
Definition: Rotation3d.h:214
ipReal64 getChi() const
retrieve parameters associated to transformation
Definition: Rotation3d.h:202