DGtal 1.4.0
Loading...
Searching...
No Matches
FunctorsLambdaMST.h
1
17#pragma once
18
29#if defined(FunctorsLambdaMST_RECURSES)
30#error Recursive header files inclusion detected in FunctorsLambdaMST.h
31#else // defined(FunctorsLambdaMST_RECURSES)
33#define FunctorsLambdaMST_RECURSES
34
35#if !defined FunctorsLambdaMST_h
37#define FunctorsLambdaMST_h
38
40// Inclusions
41#include <functional>
42#include <iterator>
43#include <stdexcept>
44#include "DGtal/base/Common.h"
45#include "DGtal/base/IteratorCirculatorTraits.h"
46#include "DGtal/base/CUnaryFunctor.h"
48
49namespace DGtal
50{
52
61namespace functors
62{
69 {
70 double operator() (double x) const
71 {
72 double e2 = x * x;
73 double e3 = e2 * x;
74 return 64.0 * ( -e3 * e3 + 3.0 * e3 * e2 - 3.0 * e2 * e2 + e3 );
75 }
76 };
83 {
84 double operator() (double x) const
85 {
86 return std::sin ( M_PI * x );
87 }
88 };
89
96 {
97 double operator() (double x) const
98 {
99 return 2.0 / ( std::exp ( 15.0 * ( x - 0.5 ) ) + std::exp ( -15.0 * ( x - 0.5 ) ) );
100 }
101 };
102}
103
111template<typename DSS, typename LambdaFunction>
113{
114 BOOST_CONCEPT_ASSERT(( concepts::CUnaryFunctor < LambdaFunction, double, double > ));
115 // ----------------------- Types ------------------------------
116public:
118 typedef DSS TDSS;
119
120 struct Value
121 {
123 double second;
124 Value () : second ( 0. ) {}
126 {
127 this->first += ch.first;
128 this->second += ch.second;
129 return *this;
130 }
131 };
132
133
134 // ----------------------- Interface --------------------------------------
135public:
143 Value operator() ( const TDSS& aDSS, const int & indexOfPointInDSS, const int & dssLen ) const
144 {
145 Value result;
146 double norm = std::sqrt ( aDSS.a() * aDSS.a() + aDSS.b() * aDSS.b() );
147 result.second = lambdaFunctor ( (double)indexOfPointInDSS / (double)dssLen );
148 if ( norm > 0. )
149 {
150 result.first[0] = result.second * aDSS.b() / norm;
151 result.first[1] = result.second * aDSS.a() / norm;
152 }
153 else
154 {
155 result.first[0] = 0.;
156 result.first[1] = 0.;
157 }
158 return result;
159 }
160private:
161 // ------------------------- Private Datas --------------------------------
162 LambdaFunction lambdaFunctor;
163};
164
172template<typename DSS, typename LambdaFunction>
174{
175 BOOST_CONCEPT_ASSERT(( concepts::CUnaryFunctor < LambdaFunction, double, double > ));
176public:
177 // ----------------------- Types ------------------------------
179 typedef DSS TDSS;
180 struct Value
181 {
183 double second;
184 Value () : second ( 0. ) {}
186 {
187 this->first += ch.first;
188 this->second += ch.second;
189 return *this;
190 }
191 };
192
193 // ----------------------- Interface --------------------------------------
201 Value operator() ( const TDSS& aDSS, const unsigned int indexOfPointInDSS, const unsigned int dssLen ) const
202 {
203 Value result;
204 typename DSS::Point3d directionZ3;
205 RealVector direction;
206 typename DSS::PointR3d intercept;
207 typename DSS::PointR3d thikness;
208
209 aDSS.getParameters ( directionZ3, intercept, thikness );
210 direction[0] = directionZ3[0];
211 direction[1] = directionZ3[1];
212 direction[2] = directionZ3[2];
213
214 result.second = lambdaFunctor ( (double)indexOfPointInDSS / (double)dssLen );
215
216 double norm = direction.norm();
217 if ( norm != 0. )
218 direction /= norm;
219 result.first = direction * result.second;
220 return result;
221 }
222private:
223 // ------------------------- Private Datas --------------------------------
225 LambdaFunction lambdaFunctor;
226};
227
228
234template<typename DSS >
236{
237public:
238// ----------------------- Types ------------------------------
239 typedef DSS DSSType;
241
243 bool operator()( const DSSType & ) const
244 {
245 return false;
246 }
247
249 bool admissibility ( const DSSType &, const Point & ) const
250 {
251 return false;
252 }
253
255 long int position ( const DSSType &, const Point & ) const
256 {
257 throw std::runtime_error ( "You are not suppose to see this error!" );
258 }
259};
260
261
268template<typename DSS >
270{
271public:
272// ----------------------- Types ------------------------------
273 typedef DSS DSSType;
275
277
281 void init ( double threshold )
282 {
283 if ( threshold < 0. )
284 throw std::runtime_error ( "The threshold has to be positive!" );
285 lenThreshold = threshold;
286 initThreshold = true;
287 }
288
293 bool operator()( const DSSType & dss ) const
294 {
295 if (! initThreshold )
296 throw std::runtime_error ( "The filter has to be initialized!" );
297
298 return std::distance ( dss.begin ( ), dss.end ( ) ) < lenThreshold;
299 }
300
307 bool admissibility ( const DSSType & dss, const Point & p ) const
308 {
309 return ( p - *dss.begin ( ) ).norm ( ) <= lenThreshold || ( p - *( dss.end ( ) - 1 ) ).norm ( ) <= lenThreshold;
310 }
311
319 long int position ( const DSSType & dss, const Point & p ) const
320 {
321 if ( ( p - *dss.begin ( ) ).norm ( ) <= lenThreshold )
322 return 1;
323 else if ( ( p - *( dss.end ( ) - 1 ) ).norm ( ) <= lenThreshold )
324 return std::distance ( dss.begin ( ), dss.end ( ) ) + 1;
325 else
326 throw std::runtime_error ( "The DSS and the point are not admissible!" );
327 }
328
329private:
332};
333
334} // namespace DGtal
335
336// //
338
339#endif // !defined FunctorsLambdaMST_h
340
341#undef FunctorsLambdaMST_RECURSES
342#endif // else defined(FunctorsLambdaMST_RECURSES)
bool operator()(const DSSType &dss) const
long int position(const DSSType &dss, const Point &p) const
bool admissibility(const DSSType &dss, const Point &p) const
IteratorCirculatorTraits< typenameDSSType::ConstIterator >::Value Point
bool operator()(const DSSType &) const
Always returns false.
long int position(const DSSType &, const Point &) const
When called always throws an exception.
IteratorCirculatorTraits< typenameDSSType::ConstIterator >::Value Point
bool admissibility(const DSSType &, const Point &) const
Always returns false.
Aim: Implements basic operations that will be used in Point and Vector classes.
double norm(const NormType type=L_2) const
BOOST_CONCEPT_ASSERT((concepts::CUnaryFunctor< LambdaFunction, double, double >))
Value operator()(const TDSS &aDSS, const int &indexOfPointInDSS, const int &dssLen) const
PointVector< 2, double > RealVector
Value operator()(const TDSS &aDSS, const unsigned int indexOfPointInDSS, const unsigned int dssLen) const
BOOST_CONCEPT_ASSERT((concepts::CUnaryFunctor< LambdaFunction, double, double >))
PointVector< 3, double > RealVector
DGtal is the top-level namespace which contains all DGtal functions and types.
DGtal::MelkmanConvexHull< Point, Functor > ch