DGtal  1.5.beta
Lemniscate2D.h
1 
17 #pragma once
18 
31 #if defined(Lemniscate2D_RECURSES)
32 #error Recursive header files inclusion detected in Lemniscate2D.h
33 #else // defined(Lemniscate2D_RECURSES)
35 #define Lemniscate2D_RECURSES
36 
37 #if !defined Lemniscate2D_h
39 #define Lemniscate2D_h
40 
42 // Inclusions
43 #include <iostream>
44 #include <DGtal/base/Common.h>
45 #include <DGtal/shapes/parametric/StarShaped2D.h>
46 #include <cmath>
48 
49 namespace DGtal
50 {
51 
53  // template class Lemniscate2D
60  template <typename TSpace>
61  class Lemniscate2D : public DGtal::StarShaped2D<TSpace>
62  {
63  // ----------------------- Standard services ------------------------------
64  public:
65 
66  typedef TSpace Space;
67  typedef typename Space::RealPoint RealPoint;
68  typedef typename Space::RealVector RealVector;
69 
74  Lemniscate2D() = delete;
75 
83  Lemniscate2D( const double x0, const double y0,
84  const double a );
85 
93  Lemniscate2D( const RealPoint& aPoint, const double a );
94 
99  Lemniscate2D( const Lemniscate2D& other );
100 
107  Lemniscate2D& operator=( const Lemniscate2D& other ) = delete;
108 
112  ~Lemniscate2D() = default;
113 
114  // ------------- Implementation of 'StarShaped' services ------------------
115  public:
116 
122  {
123  return RealPoint( myCenter[0] - myA, myCenter[1] - myA * 0.5 );
124  }
125 
131  {
132  return RealPoint( myCenter[0] + myA, myCenter[1] + myA * 0.5 );
133  }
134 
139  {
140  return myCenter;
141  }
142 
147  inline
148  void moveTo( const RealPoint& newCenter )
149  {
150  myCenter = newCenter;
151  }
152 
159  double parameter( const RealPoint & p ) const;
160 
167  RealPoint x( const double t ) const;
168 
175  RealVector xp( const double t ) const;
176 
182  RealVector xpp( const double t ) const;
183 
184 
185  // ------------------------- data -----------------------------------------
186  private:
187 
192 
196  double myA;
197 
198  // ----------------------- Interface --------------------------------------
199  public:
200 
205  void selfDisplay ( std::ostream & out ) const;
206 
207 
212  bool isValid() const;
213 
214  // ------------------------- Hidden services ------------------------------
215  private:
216 
220  template <typename T>
221  inline
222  bool isAlmostEqual( T x, T y ) const
223  {
224  return std::abs(x - y) <= std::numeric_limits<T>::epsilon();
225  }
226 
227  }; // end of class Lemniscate2D
228 
229 
230 
237  template <typename T>
238  std::ostream&
239  operator<< ( std::ostream & out, const Lemniscate2D<T> & object );
240 
241 } // namespace DGtal
242 
243 
245 // Includes inline functions.
246 #include "DGtal/shapes/parametric/Lemniscate2D.ih"
247 
248 // //
250 
251 #endif // !defined Lemniscate2D_h
252 
253 #undef Lemniscate2D_RECURSES
254 #endif // else defined(Lemniscate2D_RECURSES)
Aim: Model of the concept StarShaped represents a lemniscate.
Definition: Lemniscate2D.h:62
void moveTo(const RealPoint &newCenter)
Definition: Lemniscate2D.h:148
bool isValid() const
Lemniscate2D(const RealPoint &aPoint, const double a)
bool isAlmostEqual(T x, T y) const
Definition: Lemniscate2D.h:222
Lemniscate2D(const Lemniscate2D &other)
RealVector xp(const double t) const
RealPoint getUpperBound() const
Definition: Lemniscate2D.h:130
Space::RealVector RealVector
Definition: Lemniscate2D.h:68
void selfDisplay(std::ostream &out) const
RealPoint getLowerBound() const
Definition: Lemniscate2D.h:121
RealPoint x(const double t) const
double parameter(const RealPoint &p) const
RealVector xpp(const double t) const
Space::RealPoint RealPoint
Definition: Lemniscate2D.h:67
Lemniscate2D(const double x0, const double y0, const double a)
RealPoint center() const
Definition: Lemniscate2D.h:138
~Lemniscate2D()=default
Lemniscate2D & operator=(const Lemniscate2D &other)=delete
Aim: Implements basic operations that will be used in Point and Vector classes.
Definition: PointVector.h:593
DGtal is the top-level namespace which contains all DGtal functions and types.
std::ostream & operator<<(std::ostream &out, const ATu0v1< TKSpace, TLinearAlgebra > &object)
const Point aPoint(3, 4)
PointVector< 3, double > RealPoint