IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
Similarity2d.h
1 // Similarity2d.h:
3 // ---------------
4 //
14 
15 #ifndef __IPSDKMATH_SIMILARITY2D_H__
16 #define __IPSDKMATH_SIMILARITY2D_H__
17 
18 // suppression warnings
19 // warning C4251: 'ipsdk::math::transform::Similarity2d::g_registrator' : struct 'ipsdk::math::transform::Registrator<ipsdk::math::transform::Similarity2d>' needs to have dll-interface to be used by clients of class 'ipsdk::math::transform::Similarity2d'
20 #pragma warning (push)
21 #pragma warning (disable : 4251)
22 
23 #include <IPSDKMath/Geometry/2d/Transform/BaseLinearGeometricTransform2d.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_Theta)
42  (eTP_Tx)
43  (eTP_Ty)
44  );
45 
46  // declare geometric transformation 2d
48 
49 public:
52  Similarity2d()
53  {
54  setParams(1, 0, 0, 0);
55  }
56  Similarity2d(const ipReal64 scale, const ipReal64 theta, const ipReal64 tx, const ipReal64 ty)
57  {
58  setParams(scale, theta, tx, ty);
59  }
60  ~Similarity2d() {}
62 
63 // methods
64 public:
67  static void transform(const ipReal64 scale,
68  const ipReal64 theta,
69  const ipReal64 tx, const ipReal64 ty,
70  ipReal64& x, ipReal64& y)
71  {
72  transform(scale, std::cos(theta), std::sin(theta), tx, ty, x, y);
73  }
74  static void transform(const ipReal64 scale,
75  const ipReal64 cosTheta, const ipReal64 sinTheta,
76  const ipReal64 tx, const ipReal64 ty,
77  ipReal64& x, ipReal64& y)
78  {
79  rotate2dInSitu(cosTheta, sinTheta, x, y);
80  x *= scale;
81  y *= scale;
82  x += tx;
83  y += ty;
84  }
86 
89  static Matrix3d getHomogenousMatrix(const ipReal64 scale,
90  const ipReal64 theta,
91  const ipReal64 tx, const ipReal64 ty)
92  {
93  return getHomogenousMatrix(scale, std::cos(theta), std::sin(theta), tx, ty);
94  }
96  const ipReal64 cosTheta, const ipReal64 sinTheta,
97  const ipReal64 tx, const ipReal64 ty)
98  {
99  Matrix3d transform;
100  angleToMatrix(cosTheta, sinTheta,
101  transform(0, 0), transform(0, 1),
102  transform(1, 0), transform(1, 1));
103  transform(0, 0) *= scale;
104  transform(0, 1) *= scale;
105  transform(1, 0) *= scale;
106  transform(1, 1) *= scale;
107  transform(0, 2) = tx;
108  transform(1, 2) = ty;
109  transform(2, 0) = 0; transform(2, 1) = 0; transform(2, 2) = 1;
110 
111  return transform;
112  }
114 
116  static Matrix3d getInvHomogenousMatrix(const ipReal64 scale,
117  const ipReal64 theta,
118  const ipReal64 tx, const ipReal64 ty)
119  {
120  ipReal64 invScale = 0;
121  if (scale != 0)
122  invScale = 1 / scale;
123  const ipReal64 cosTheta = std::cos(theta);
124  const ipReal64 sinTheta = std::sin(theta);
125  const ipReal64 invTx = -(cosTheta*tx + sinTheta*ty) * invScale;
126  const ipReal64 invTy = -(-sinTheta*tx + cosTheta*ty) * invScale;
127  return getHomogenousMatrix(invScale, cosTheta, -sinTheta, invTx, invTy);
128  }
129 
131  static void getInvParams(ipReal64& scale, ipReal64& theta, ipReal64& tx, ipReal64& ty)
132  {
133  ipReal64 invScale = 0;
134  if (scale != 0)
135  invScale = 1 / scale;
136  const ipReal64 cosTheta = std::cos(theta);
137  const ipReal64 sinTheta = std::sin(theta);
138  const ipReal64 invTx = -(cosTheta*tx + sinTheta*ty) * invScale;
139  const ipReal64 invTy = -(-sinTheta*tx + cosTheta*ty) * invScale;
140  scale = invScale;
141  theta = -theta;
142  tx = invTx;
143  ty = invTy;
144  }
145 
147  static Vector getIdentityParams();
148 
150  void setParams(const ipReal64 scale,
151  const ipReal64 theta,
152  const ipReal64 tx, const ipReal64 ty)
153  {
154  _scale = scale;
155  _theta = theta;
156  _cosTheta = std::cos(_theta);
157  _sinTheta = std::sin(_theta);
158  _tx = tx;
159  _ty = ty;
160  }
161 
165  void setParams(const Vector& params);
166 
168  void setIdentity();
169 
172  ipReal64 getScale() const;
173  ipReal64 getTheta() const;
174  ipReal64 getTx() const;
175  ipReal64 getTy() const;
177 
179  void apply(ipReal64& x, ipReal64& y) const;
180 
182  Matrix3d getHomogenousMatrix() const;
183 
185  Vector getParams() const;
186 
188  Matrix3d getInvHomogenousMatrix() const;
189 
191  Vector getInvParams() const;
192 
193 // attributes
194 protected:
196  ipReal64 _scale;
197 
199  ipReal64 _theta;
200 
203  ipReal64 _cosTheta;
204  ipReal64 _sinTheta;
206 
208  ipReal64 _tx;
211  ipReal64 _ty;
212 };
213 
216 
217 inline ipReal64
219 {
220  return _scale;
221 }
222 
223 inline ipReal64
225 {
226  return _theta;
227 }
228 
229 inline ipReal64
231 {
232  return _tx;
233 }
234 
235 inline ipReal64
237 {
238  return _ty;
239 }
240 
241 inline void
243 {
245 }
246 
249 
250 } // end of namespace transform
251 } // end of namespace math
252 } // end of namespace ipsdk
253 
254 #pragma warning (pop)
255 
256 #endif // __IPSDKMATH_SIMILARITY2D_H__
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
ipReal64 _scale
transformation scale
Definition: Similarity2d.h:202
IPSDK_FORCEINLINE void angleToMatrix(const T cosTheta, const T sinTheta, T &rxx, T &rxy, T &ryx, T &ryy)
Convertion from angle to rotation matrix.
Definition: Angles2d.h:80
ipReal64 _ty
translation coordinate along y axis
Definition: Similarity2d.h:217
ipReal64 _tx
translation coordinate along x axis
Definition: Similarity2d.h:214
void setParams(const ipReal64 scale, const ipReal64 theta, const ipReal64 tx, const ipReal64 ty)
select parameters associated to transformation
Definition: Similarity2d.h:156
static Matrix3d getHomogenousMatrix(const ipReal64 scale, const ipReal64 theta, const ipReal64 tx, const ipReal64 ty)
retrieve homogeneous matrix associated to transformation
Definition: Similarity2d.h:95
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
Utility functions used to handle angles 2d.
Definition: Similarity2d.h:33
IPSDKGEOMETRY_API bool apply(const BaseGeometryTransform2d &transform, BaseGeometryEntity2d &entity)
function allowing to apply in situ a given transformation on an entity
boost::numeric::ublas::vector< ipReal64 > Vector
vector type associated to library
Definition: LinearAlgebraTypes.h:36
ipReal64 _theta
angle of rotation in radians
Definition: Similarity2d.h:205
static Vector getIdentityParams()
retrieve identity parameters for transformation
ipReal64 getScale() const
retrieve parameters associated to transformation
Definition: Similarity2d.h:224
#define IPSDKMATH_API
Import/Export macro for library IPSDKMath.
Definition: IPSDKMathExports.h:27
ipReal64 getTheta() const
retrieve parameters associated to transformation
Definition: Similarity2d.h:230
ipReal64 getTy() const
retrieve parameters associated to transformation
Definition: Similarity2d.h:242
Transformation class allowing to manage 2d similarity transformations.
boost::numeric::ublas::bounded_matrix< ipReal64, 3, 3 > Matrix3d
3d matrix (3x3) type associated to library
Definition: LinearAlgebraTypes.h:54
eTransformParams
Definition: Similarity2d.h:40
ipReal64 getTx() const
retrieve parameters associated to transformation
Definition: Similarity2d.h:236
void setIdentity()
set transformation parameters to identity
Definition: Similarity2d.h:248
Base class for linear geometric transformation 2d management.
Definition: BaseLinearGeometricTransform2d.h:27
#define IPSDK_ENUM(enumTypeStr, enumSeq)
macro allowing to declare an enumerate for library
Definition: EnumMacros.h:26
IPSDK_FORCEINLINE void rotate2dInSitu(const ipReal64 cosTheta, const ipReal64 sinTheta, T &x, T &y)
rotation of a point using a rotation angle (rotation around origin)
Definition: Angles2d.h:156
#define IPSDK_DECLARE_TRANSFORM2D(className)
macro allowing to declare a geometric transformation 2d
Definition: Transform2dHdrMacros.h:55