IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
AnisotropicScale3d.h
1 // AnisotropicScale3d.h:
3 // ---------------------
4 //
15 
16 #ifndef __IPSDKMATH_ANISOTROPICSCALE3D_H__
17 #define __IPSDKMATH_ANISOTROPICSCALE3D_H__
18 
19 // suppression warnings
20 // warning C4251: 'ipsdk::math::transform::AnisotropicScale3d::g_registrator' : struct 'ipsdk::math::transform::Registrator<ipsdk::math::transform::AnisotropicScale3d>' needs to have dll-interface to be used by clients of class 'ipsdk::math::transform::AnisotropicScale3d'
21 #pragma warning (push)
22 #pragma warning (disable : 4251)
23 
24 #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_ScaleX)
41  (eTP_ScaleY)
42  (eTP_ScaleZ)
43  );
44 
45  // declare geometric transformation 3d
47 
48 public:
52  {
53  setParams(1, 1, 1);
54  }
55  AnisotropicScale3d(const ipReal64 scaleX, const ipReal64 scaleY, const ipReal64 scaleZ)
56  {
57  setParams(scaleX, scaleY, scaleZ);
58  }
59  ~AnisotropicScale3d() {}
61 
62 // methods
63 public:
66  static void transform(const ipReal64 scaleX,
67  const ipReal64 scaleY,
68  const ipReal64 scaleZ,
69  ipReal64& x, ipReal64& y, ipReal64& z)
70  {
71  x *= scaleX;
72  y *= scaleY;
73  z *= scaleZ;
74  }
76 
79  static Matrix4d getHomogenousMatrix(const ipReal64 scaleX,
80  const ipReal64 scaleY,
81  const ipReal64 scaleZ)
82  {
83  Matrix4d transform;
84  transform(0, 0) = scaleX; transform(0, 1) = 0; transform(0, 2) = 0; transform(0, 3) = 0;
85  transform(1, 0) = 0; transform(1, 1) = scaleY; transform(1, 2) = 0; transform(1, 3) = 0;
86  transform(2, 0) = 0; transform(2, 1) = 0; transform(2, 2) = scaleZ; transform(2, 3) = 0;
87  transform(3, 0) = 0; transform(3, 1) = 0; transform(3, 2) = 0; transform(3, 3) = 1;
88 
89  return transform;
90  }
92 
94  static Matrix4d getInvHomogenousMatrix(const ipReal64 scaleX,
95  const ipReal64 scaleY,
96  const ipReal64 scaleZ)
97  {
98  ipReal64 invScaleX = 0;
99  if (scaleX != 0)
100  invScaleX = 1 / scaleX;
101  ipReal64 invScaleY = 0;
102  if (scaleY != 0)
103  invScaleY = 1 / scaleY;
104  ipReal64 invScaleZ = 0;
105  if (scaleZ != 0)
106  invScaleZ = 1 / scaleZ;
107  return getHomogenousMatrix(invScaleX, invScaleY, invScaleZ);
108  }
109 
111  static void getInvParams(ipReal64& scaleX, ipReal64& scaleY, ipReal64& scaleZ)
112  {
113  if (scaleX != 0)
114  scaleX = 1 / scaleX;
115  else
116  scaleX = 0;
117  if (scaleY != 0)
118  scaleY = 1 / scaleY;
119  else
120  scaleY = 0;
121  if (scaleZ != 0)
122  scaleZ = 1 / scaleZ;
123  else
124  scaleZ = 0;
125  }
126 
128  static Vector getIdentityParams();
129 
131  void setParams(const ipReal64 scaleX,
132  const ipReal64 scaleY,
133  const ipReal64 scaleZ)
134  {
135  _scaleX = scaleX;
136  _scaleY = scaleY;
137  _scaleZ = scaleZ;
138  }
139 
143  void setParams(const Vector& params);
144 
146  void setIdentity();
147 
149  void apply(ipReal64& x, ipReal64& y, ipReal64& z) const;
150 
152  Matrix4d getHomogenousMatrix() const;
153 
155  Vector getParams() const;
156 
159  ipReal64 getScaleX() const;
160  ipReal64 getScaleY() const;
161  ipReal64 getScaleZ() const;
163 
165  Matrix4d getInvHomogenousMatrix() const;
166 
168  Vector getInvParams() const;
169 
170 // attributes
171 protected:
173  ipReal64 _scaleX;
174 
176  ipReal64 _scaleY;
177 
179  ipReal64 _scaleZ;
180 };
185 inline ipReal64
187 {
188  return _scaleX;
189 }
190 
191 inline ipReal64
193 {
194  return _scaleY;
195 }
196 
197 inline ipReal64
199 {
200  return _scaleX;
201 }
202 
203 inline void
205 {
207 }
208 
211 
212 } // end of namespace transform
213 } // end of namespace math
214 } // end of namespace ipsdk
215 
216 #pragma warning (pop)
217 
218 #endif // __IPSDKMATH_ANISOTROPICSCALE3D_H__
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
void setIdentity()
set transformation parameters to identity
Definition: AnisotropicScale3d.h:209
void setParams(const ipReal64 scaleX, const ipReal64 scaleY, const ipReal64 scaleZ)
select parameters associated to transformation
Definition: AnisotropicScale3d.h:136
ipReal64 _scaleX
transformation scale along x axis
Definition: AnisotropicScale3d.h:178
Base class for linear geometric transformation 3d management.
Definition: BaseLinearGeometricTransform3d.h:27
eTransformParams
Definition: AnisotropicScale3d.h:40
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
ipReal64 getScaleY() const
retrieve parameters associated to transformation
Definition: AnisotropicScale3d.h:197
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 getScaleZ() const
retrieve parameters associated to transformation
Definition: AnisotropicScale3d.h:203
Definition: AnisotropicScale3d.h:33
ipReal64 _scaleY
transformation scale along y axis
Definition: AnisotropicScale3d.h:181
Transformation class allowing to manage 3d anisotropic scale transformations.
static Vector getIdentityParams()
retrieve identity parameters for transformation
ipReal64 getScaleX() const
retrieve parameters associated to transformation
Definition: AnisotropicScale3d.h:191
#define IPSDK_ENUM(enumTypeStr, enumSeq)
macro allowing to declare an enumerate for library
Definition: EnumMacros.h:26