DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
LocalConvolutionNormalVectorEstimator.ih
1 
30 
31 #include <cstdlib>
33 
35 // IMPLEMENTATION of inline methods.
37 
39 // ----------------------- Standard services ------------------------------
40 
44 template <typename DigitalSurf, typename KernelFunctor>
45 inline
47 ::LocalConvolutionNormalVectorEstimator ( const DigitalSurf & digitalSurface,
48  const KernelFunctor & aKernelFunctor )
49  : mySurface ( digitalSurface ), myKernelFunctor ( aKernelFunctor )
50 {
51 }
52 
56 template <typename DigitalSurf, typename KernelFunctor>
57 inline
58 void
60  const unsigned int radius )
61 {
62  myFlagIsInit = true;
63  myH = h;
64  myRadius = radius;
65 }
66 
71 template <typename DigitalSurf, typename KernelFunctor>
72 template <typename OutputIterator>
73 inline
74 OutputIterator
76 eval ( const ConstIterator& itb,
77  const ConstIterator& ite,
78  OutputIterator result ) const
79 {
80  for ( ConstIterator it = itb; it != ite; ++it )
81  {
82  Quantity q = eval( *it );
83  *result++ = q;
84  }
85 
86  return result;
87 }
88 
89 //-----------------------------------------------------------------------------
90 template <typename DigitalSurf, typename KernelFunctor>
91 inline
94 surface() const
95 {
96  return mySurface;
97 }
98 
99 //-----------------------------------------------------------------------------
100 template <typename DigitalSurf, typename KernelFunctor>
101 template <typename OutputIterator>
102 inline
103 OutputIterator
105 evalAll ( OutputIterator result ) const
106 {
107  for ( ConstIterator it = surface().begin(), it_end = surface().end();
108  it != it_end; ++it )
109  {
110  *result++ = eval ( *it );
111  }
112 
113  return result;
114 }
115 
120 template <typename DigitalSurf, typename KernelFunctor>
121 inline
124 {
125  return eval ( *it );
126 }
127 //-----------------------------------------------------------------------------
128 template <typename DigitalSurf, typename KernelFunctor>
129 inline
132 eval ( const SCell & scell ) const
133 {
134  typedef BreadthFirstVisitor<DigitalSurf> MyBreadthFirstVisitor;
135  typedef typename MyBreadthFirstVisitor::Node MyNode;
136  typedef typename MyBreadthFirstVisitor::Size MySize;
137  MyBreadthFirstVisitor visitor ( mySurface, scell );
138 
139  MyNode node;
140  Quantity n, elementary;
141  Dimension i;
142  typename DigitalSurf::Surfel s;
143  const typename DigitalSurf::KSpace & K = mySurface.container().space();
144 
145  ASSERT ( myFlagIsInit );
146 
147  while ( ! visitor.finished() )
148  {
149  node = visitor.current();
150  if ( node.second < myRadius )
151  {
152  s = node.first;
153  i = K.sOrthDir ( s );
154  elementary[ i ] = K.sDirect ( s, i ) ? 1 : -1;
155 
156  elementary *= myKernelFunctor ( node.second );
157  n+= elementary;
158 
159  elementary [ i ] = 0;
160 
161  visitor.expand();
162  }
163  else
164  visitor.ignore();
165  }
166  return n.getNormalized();
167 }
168 
169 
174 template <typename DigitalSurf, typename KernelFunctor>
175 inline
176 bool
178 {
179  return true;
180 }
181 
182