2 * This program is free software: you can redistribute it and/or modify
3 * it under the terms of the GNU Lesser General Public License as
4 * published by the Free Software Foundation, either version 3 of the
5 * License, or (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 * @file LocalEstimatorFromSurfelFunctorAdapter.ih
19 * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr )
20 * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France
24 * Implementation of inline methods defined in LocalEstimatorFromSurfelFunctorAdapter.h
26 * This file is part of the DGtal library.
29 //////////////////////////////////////////////////////////////////////////////
31 //////////////////////////////////////////////////////////////////////////////
33 ///////////////////////////////////////////////////////////////////////////////
34 // IMPLEMENTATION of inline methods.
35 ///////////////////////////////////////////////////////////////////////////////
37 template <typename TDigitalSurfaceContainer, typename TMetric,
38 typename TFunctorOnSurfel, typename TConvolutionFunctor>
40 DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
41 TFunctorOnSurfel, TConvolutionFunctor>::
42 LocalEstimatorFromSurfelFunctorAdapter()
47 template <typename TDigitalSurfaceContainer, typename TMetric,
48 typename TFunctorOnSurfel, typename TConvolutionFunctor>
50 DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
51 TFunctorOnSurfel, TConvolutionFunctor>::
52 LocalEstimatorFromSurfelFunctorAdapter
53 ( ConstAlias< Surface > aSurf,
54 ConstAlias< Metric> aMetric,
55 Alias< FunctorOnSurfel > aFunctor,
56 ConstAlias< ConvolutionFunctor > aConvolutionFunctor)
57 : mySurface(aSurf), myFunctor(&aFunctor), myMetric(aMetric),
58 myEmbedder(Embedder( mySurface->container().space())), myConvFunctor(aConvolutionFunctor)
62 ///////////////////////////////////////////////////////////////////////////////
63 template <typename TDigitalSurfaceContainer, typename TMetric,
64 typename TFunctorOnSurfel, typename TConvolutionFunctor>
66 DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
67 TFunctorOnSurfel, TConvolutionFunctor>::
68 ~LocalEstimatorFromSurfelFunctorAdapter()
72 ///////////////////////////////////////////////////////////////////////////////
73 template <typename TDigitalSurfaceContainer, typename TMetric,
74 typename TFunctorOnSurfel, typename TConvolutionFunctor>
77 DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
78 TFunctorOnSurfel, TConvolutionFunctor>::
79 selfDisplay ( std::ostream & out ) const
81 out << "[LocalEstimatorFromSurfelFunctorAdapter]";
83 ///////////////////////////////////////////////////////////////////////////////
84 template <typename TDigitalSurfaceContainer, typename TMetric,
85 typename TFunctorOnSurfel, typename TConvolutionFunctor>
88 DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
89 TFunctorOnSurfel, TConvolutionFunctor>::
96 //-----------------------------------------------------------------------------
97 template <typename TDigitalSurfaceContainer, typename TMetric,
98 typename TFunctorOnSurfel, typename TConvolutionFunctor>
101 DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
102 TFunctorOnSurfel, TConvolutionFunctor>::
103 attach( ConstAlias<Surface> aSurface )
105 mySurface = aSurface;
106 myEmbedder = Embedder( mySurface->container().space());
109 //-----------------------------------------------------------------------------
110 template <typename TDigitalSurfaceContainer, typename TMetric,
111 typename TFunctorOnSurfel, typename TConvolutionFunctor>
114 DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
115 TFunctorOnSurfel, TConvolutionFunctor>::
116 setParams( ConstAlias<TMetric> aMetric,
117 Alias<FunctorOnSurfel> aFunctor,
118 ConstAlias<ConvolutionFunctor> aConvolutionFunctor,
122 myFunctor = &aFunctor;
124 myConvFunctor = aConvolutionFunctor;
128 //-----------------------------------------------------------------------------
129 template <typename TDigitalSurfaceContainer, typename TMetric,
130 typename TFunctorOnSurfel, typename TConvolutionFunctor>
132 typename DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric, TFunctorOnSurfel, TConvolutionFunctor>::Scalar
133 DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
134 TFunctorOnSurfel, TConvolutionFunctor>::
140 ///////////////////////////////////////////////////////////////////////////////
141 template <typename TDigitalSurfaceContainer, typename TMetric,
142 typename TFunctorOnSurfel, typename TConvolutionFunctor>
144 template<typename SurfelIt>
147 DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
148 TFunctorOnSurfel, TConvolutionFunctor>::
149 init(const double _h,
157 ///////////////////////////////////////////////////////////////////////////////
158 template <typename TDigitalSurfaceContainer, typename TMetric,
159 typename TFunctorOnSurfel, typename TConvolutionFunctor>
160 template <typename SurfelConstIterator>
162 typename DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
163 TFunctorOnSurfel, TConvolutionFunctor>::Quantity
164 DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
165 TFunctorOnSurfel, TConvolutionFunctor>::
166 eval( const SurfelConstIterator& it ) const
168 ASSERT_MSG( isValid(), "Missing init() before evaluation" );
169 const MetricToPoint metricToPoint = std::bind( *myMetric, myEmbedder( *it ), std::placeholders::_1 );
170 const VertexFunctor vfunctor( myEmbedder, metricToPoint);
171 Visitor visitor( *mySurface, vfunctor, *it);
172 ASSERT( ! visitor.finished() );
173 double currentDistance = 0.0;
174 while ( (! visitor.finished() ) && (currentDistance < myRadius) )
176 typename Visitor::Node node = visitor.current();
177 currentDistance = node.second;
178 if ( currentDistance < myRadius )
179 myFunctor->pushSurfel( node.first , myConvFunctor->operator()((myRadius - currentDistance)/myRadius));
183 Quantity val = myFunctor->eval();
187 ///////////////////////////////////////////////////////////////////////////////
188 template <typename TDigitalSurfaceContainer, typename TMetric,
189 typename TFunctorOnSurfel, typename TConvolutionFunctor>
190 template <typename SurfelConstIterator, typename OutputIterator>
193 DGtal::LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
194 TFunctorOnSurfel, TConvolutionFunctor>::
195 eval ( const SurfelConstIterator& itb,
196 const SurfelConstIterator& ite,
197 OutputIterator result ) const
199 for ( SurfelConstIterator it = itb; it != ite; ++it )
201 Quantity q = eval( it );
206 ///////////////////////////////////////////////////////////////////////////////
207 template <typename TDigitalSurfaceContainer, typename TMetric,
208 typename TFunctorOnSurfel, typename TConvolutionFunctor>
211 DGtal::operator<< ( std::ostream & out,
212 const LocalEstimatorFromSurfelFunctorAdapter<TDigitalSurfaceContainer, TMetric,
213 TFunctorOnSurfel, TConvolutionFunctor> & object )
215 object.selfDisplay( out );
218 ///////////////////////////////////////////////////////////////////////////////