IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
Ellipse2d.h
1 // Ellipse2d.h:
3 // ------------
4 //
16 
17 #ifndef __IPSDKGEOMETRY_ELLIPSE2D_H__
18 #define __IPSDKGEOMETRY_ELLIPSE2D_H__
19 
20 // suppression warnings
21 // warning C4251: 'ipsdk::geom::Ellipse2d<T>::_centerPt' : struct 'ipsdk::geom::Point2dData<T>' needs to have dll-interface to be used by clients of class 'ipsdk::geom::Ellipse2d<T>'
22 #pragma warning (push)
23 #pragma warning (disable : 4251)
24 
26 #include <IPSDKGeometry/Entity/2d/BaseTypedGeometryEntity2d.h>
27 #include <IPSDKGeometry/Entity/2d/Point/Point2d.h>
32 
33 namespace ipsdk {
34 namespace geom {
35 
38 
39 template <typename T>
41 {
42  // declare 2d geometry entity
44 
45 // predefined public types
46 public:
48  static const eCoordinateSystem2dType::domain g_coordinateSystem2dType = eCoordinateSystem2dType::eCS2DT_Cartesian;
49 
51  static const eEntity2dType::domain g_entity2dType = eEntity2dType::eE2DT_BoundingBox;
52 
53 public:
56  Ellipse2d();
57  Ellipse2d(const Point2dData<T>& center, const T majorRadius, const T minorRadius, const ipReal64 theta);
58  Ellipse2d(const Point2d<T>& center, const T majorRadius, const T minorRadius, const ipReal64 theta);
59  Ellipse2d(const T xCenter, const T yCenter, const T majorRadius, const T minorRadius, const ipReal64 theta);
60  ~Ellipse2d();
62 
63 // methods
64 public:
66  inline eCoordinateSystem2dType getCoordinateSystem2dType() const;
67 
69  inline eEntity2dType getEntity2dType() const;
70 
73  inline void setCoords(const Point2dData<T>& centerPt,
74  const T majorRadius, const T minorRadius,
75  const ipReal64 theta);
76  inline void setCoords(const Point2d<T>& centerPt,
77  const T majorRadius, const T minorRadius,
78  const ipReal64 theta);
79  inline void setCoords(const T xCenter, const T yCenter,
80  const T majorRadius, const T minorRadius,
81  const ipReal64 theta);
82  inline void setCenter(const Point2dData<T>& center);
83  inline void setCenter(const Point2d<T>& center);
84  inline void setCenter(const T xCenter, const T yCenter);
85  inline void setMajorRadius(const T majorRadius);
86  inline void setMinorRadius(const T minorRadius);
87  inline void setTheta(const ipReal64 theta);
88  inline T getMajorRadius() const;
89  inline T getMinorRadius() const;
90  inline ipReal64 getTheta() const;
91  inline T centerX() const;
92  inline T centerY() const;
93  inline const Point2dData<T>& center() const;
95 
97  inline ipReal64 focalLength() const;
98 
101  inline Point2dData<ipReal64> focus1() const;
102  inline Point2dData<ipReal64> focus2() const;
104 
106  inline ipReal64 perimeterLowerBound() const;
107 
112  inline ipReal64 perimeterUpperBound() const;
113 
115  inline ipReal64 area() const;
116 
118  inline ipReal64 excentricity() const;
119 
121  inline ipReal64 radius(const ipReal64 phi) const;
122 
124  inline Point2dData<ipReal64> boundaryPoint(const ipReal64 phi) const;
125 
126 // attributes
127 protected:
130 
133 
136 
139 
145 };
146 
149 
150 template <typename T>
153 {
154  return g_coordinateSystem2dType;
155 }
156 
157 template <typename T>
158 inline eEntity2dType
160 {
161  return g_entity2dType;
162 }
163 
164 template <typename T>
165 inline void
167  const T majorRadius, const T minorRadius,
168  const ipReal64 theta)
169 {
170  _centerPt = centerPt;
171  _majorRadius = majorRadius;
172  _minorRadius = minorRadius;
173  setTheta(theta);
174 }
175 
176 template <typename T>
177 inline void
179  const T majorRadius, const T minorRadius,
180  const ipReal64 theta)
181 {
182  _centerPt = centerPt.getCoords();
183  _majorRadius = majorRadius;
184  _minorRadius = minorRadius;
185  setTheta(theta);
186 }
187 
188 template <typename T>
189 inline void
190 Ellipse2d<T>::setCoords(const T xCenter, const T yCenter,
191  const T majorRadius, const T minorRadius,
192  const ipReal64 theta)
193 {
194  _centerPt.setCoords(xCenter, yCenter);
195  _majorRadius = majorRadius;
196  _minorRadius = minorRadius;
197  setTheta(theta);
198 }
199 
200 template <typename T>
201 inline void
203 {
204  _centerPt = centerPt;
205 }
206 
207 template <typename T>
208 inline void
210 {
211  _centerPt = centerPt.getCoords();
212 }
213 
214 template <typename T>
215 inline void
216 Ellipse2d<T>::setCenter(const T xCenter, const T yCenter)
217 {
218  _centerPt.setCoords(xCenter, yCenter);
219 }
220 
221 template <typename T>
222 inline void
223 Ellipse2d<T>::setMajorRadius(const T majorRadius)
224 {
225  _majorRadius = majorRadius;
226 }
227 
228 template <typename T>
229 inline void
230 Ellipse2d<T>::setMinorRadius(const T minorRadius)
231 {
232  _minorRadius = minorRadius;
233 }
234 
235 template <typename T>
236 inline void
238 {
239  _theta = math::centerModulo(theta, 2*M_PI);
240  _cosTheta = std::cos(_theta);
241  _sinTheta = std::sin(_theta);
242 }
243 
244 template <typename T>
245 inline T
247 {
248  return _centerPt._x;
249 }
250 
251 template <typename T>
252 inline T
254 {
255  return _centerPt._y;
256 }
257 
258 template <typename T>
259 inline const Point2dData<T>&
261 {
262  return _centerPt;
263 }
264 
265 template <typename T>
266 inline T
268 {
269  return _majorRadius;
270 }
271 
272 template <typename T>
273 inline T
275 {
276  return _minorRadius;
277 }
278 
279 template <typename T>
280 inline ipReal64
282 {
283  return _theta;
284 }
285 
286 template <typename T>
287 inline ipReal64
289 {
290  const ipReal64 a2 = _majorRadius*_majorRadius;
291  const ipReal64 b2 = _minorRadius*_minorRadius;
292 
293  return std::sqrt(std::abs(a2 - b2));
294 }
295 
296 template <typename T>
299 {
300  const ipReal64 f = focalLength();
301 
302  return Point2dData<ipReal64>(_centerPt._x + f*_cosTheta,
303  _centerPt._y + f*_sinTheta);
304 }
305 
306 template <typename T>
309 {
310  const ipReal64 f = focalLength();
311 
312  return Point2dData<ipReal64>(_centerPt._x - f*_cosTheta,
313  _centerPt._y - f*_sinTheta);
314 }
315 
316 template <typename T>
317 inline ipReal64
319 {
320  return math::ellipsePerimeterLowerBound(_majorRadius, _minorRadius);
321 }
322 
323 template <typename T>
324 inline ipReal64
326 {
327  return math::ellipsePerimeterUpperBound(_majorRadius, _minorRadius);
328 }
329 
330 template <typename T>
331 inline ipReal64
333 {
334  return math::ellipseArea(_majorRadius, _minorRadius);
335 }
336 
337 template <typename T>
338 inline ipReal64
340 {
341  return math::ellipseExcentricity(_majorRadius, _minorRadius);
342 }
343 
344 template <typename T>
345 inline ipReal64
347 {
348  return math::ellipseRadius(_majorRadius, _minorRadius, _theta, phi);
349 }
350 
351 template <typename T>
354 {
356  math::ellipsePoint(_centerPt._x, _centerPt._y,
357  _majorRadius, _minorRadius,
358  _theta, phi,
359  pt._x, pt._y);
360 
361  return pt;
362 }
363 
366 
367 } // end of namespace geom
368 } // end of namespace ipsdk
369 
370 #pragma warning (pop)
371 
372 #endif // __IPSDKGEOMETRY_ELLIPSE2D_H__
2d ellipse class associated to cartesian 2d coordinates. For a non rotated ellipse, the major axis follows the x axis and the minor axis follows the y axis.
Definition: Ellipse2d.h:40
ipReal64 perimeterUpperBound() const
retrieve upper bound for ellipse perimeter
Definition: Ellipse2d.h:325
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
ipReal64 _cosTheta
computation intermediate
Definition: Ellipse2d.h:142
T _x
x coordinate of point
Definition: Point2dData.h:69
eCoordinateSystem2dType getCoordinateSystem2dType() const
method allowing to retrieve coordinate system 2d type
Definition: Ellipse2d.h:152
T centerX() const
access to ellipse parameters
Definition: Ellipse2d.h:246
Point class associated to cartesian 2d coordinates.
Definition: GeometryEntity2dTypes.h:28
void setTheta(const ipReal64 theta)
access to ellipse parameters
Definition: Ellipse2d.h:237
IPSDK_FORCEINLINE PackT sqrt(const PackT &in)
returns the square root of a pack
Definition: sqrt.h:40
void setCenter(const Point2dData< T > &center)
access to ellipse parameters
Definition: Ellipse2d.h:202
ipReal64 area() const
retrieve ellipse area
Definition: Ellipse2d.h:332
IPSDKMATH_API ipReal64 ellipseRadius(const ipReal64 a, const ipReal64 b, const ipReal64 phi)
function allowing to compute axis aligned ellipse &#39;radius&#39; for a given angle phi
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
ipReal64 radius(const ipReal64 phi) const
retrieve ellipse radius for a given orientation
Definition: Ellipse2d.h:346
Utility functions used to handle angles 2d.
eCoordinateSystem2dType
Enumerate describing coordinate system 2d type.
Definition: GeometryEntity2dTypes.h:76
Point2dData< ipReal64 > focus1() const
compute focus points coordinates
Definition: Ellipse2d.h:298
ipReal64 excentricity() const
retrieve ellipse excentricity
Definition: Ellipse2d.h:339
T _majorRadius
major radius
Definition: Ellipse2d.h:132
Definition of import/export macro for library.
const Point2dData< T > & center() const
access to ellipse parameters
Definition: Ellipse2d.h:260
ipReal64 getTheta() const
access to ellipse parameters
Definition: Ellipse2d.h:281
#define IPSDKGEOMETRY_API
Import/Export macro for library IPSDKGeometry.
Definition: IPSDKGeometryExports.h:25
BoundingBox.
Definition: GeometryEntity2dTypes.h:44
IPSDKMATH_API ipReal64 ellipsePerimeterUpperBound(const ipReal64 a, const ipReal64 b)
function allowing to compute upper bound value for an ellipse perimeter
Utility functions used to handle ellipses 2d.
T getMinorRadius() const
access to ellipse parameters
Definition: Ellipse2d.h:274
Base class for typed 3d geometry entities.
Definition: BaseTypedGeometryEntity2d.h:27
void setMinorRadius(const T minorRadius)
access to ellipse parameters
Definition: Ellipse2d.h:230
#define IPSDK_DECLARE_GEOMETRY_ENTITY_2D(libraryName, className)
Macro allowing to declare a geometry entity 2d.
Definition: GeometryEntity2dHdrMacros.h:131
Utility functions for ipsdk math library.
T _y
y coordinate of point
Definition: Point2dData.h:72
void setMajorRadius(const T majorRadius)
access to ellipse parameters
Definition: Ellipse2d.h:223
ipReal64 _theta
orientation (in radian) of the ellipse
Definition: Ellipse2d.h:138
ipReal64 _sinTheta
computation intermediate
Definition: Ellipse2d.h:143
eEntity2dType getEntity2dType() const
method allowing to retrieve entity 2d type
Definition: Ellipse2d.h:159
const Point2dData< T > & getCoords() const
access to point coordinates
Definition: Point2d.h:139
Point2dData< T > _centerPt
center of the ellipse
Definition: Ellipse2d.h:129
eEntity2dType
Enumerate describing entity 2d type.
Definition: GeometryEntity2dTypes.h:38
ipReal64 perimeterLowerBound() const
retrieve lower bound for ellipse perimeter
Definition: Ellipse2d.h:318
ipReal64 focalLength() const
compute focal length associated to ellipse
Definition: Ellipse2d.h:288
Point2dData< ipReal64 > focus2() const
compute focus points coordinates
Definition: Ellipse2d.h:308
Basic operators used for 2d ellipse management.
IPSDKMATH_API ipReal64 ellipseExcentricity(const ipReal64 a, const ipReal64 b)
function allowing to compute ellipse excentricity
T getMajorRadius() const
access to ellipse parameters
Definition: Ellipse2d.h:267
Lightweight structure used to store Point2d data.
Definition: GeometryEntity2dTypes.h:26
void setCoords(const Point2dData< T > &centerPt, const T majorRadius, const T minorRadius, const ipReal64 theta)
access to ellipse parameters
Definition: Ellipse2d.h:166
T centerY() const
access to ellipse parameters
Definition: Ellipse2d.h:253
T _minorRadius
minor radius
Definition: Ellipse2d.h:135
IPSDK_FORCEINLINE PackT abs(const PackT &in)
returns the absolute value of a pack
Definition: abs.h:41
IPSDKMATH_API ipReal64 ellipseArea(const ipReal64 a, const ipReal64 b)
function allowing to compute ellipse area
IPSDKMATH_API void ellipsePoint(const ipReal64 xc, const ipReal64 yc, const ipReal64 a, const ipReal64 b, const ipReal64 ellipseOrient, const ipReal64 theta, ipReal64 &ptX, ipReal64 &ptY)
function allowing to compute ellipse boundary point for a given angle
Point2dData< ipReal64 > boundaryPoint(const ipReal64 phi) const
retrieve ellipse boundary point for a given orientation
Definition: Ellipse2d.h:353
Cartesian coordinate system.
Definition: GeometryEntity2dTypes.h:78
IPSDK_FORCEINLINE ipReal64 centerModulo(const ipReal64 angle, const ipReal64 modulo)
function allowing to compute centered modulo of an angle
Definition: Angles.h:57
IPSDKMATH_API ipReal64 ellipsePerimeterLowerBound(const ipReal64 a, const ipReal64 b)
function allowing to compute lower bound value for an ellipse perimeter