DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Expander.ih
1 
30 
31 #include <cstdlib>
33 
35 // IMPLEMENTATION of inline methods.
37 
39 // ----------------------- Standard services ------------------------------
40 
44 template <typename TObject>
45 inline
47 {
48 }
49 
57 template <typename TObject>
58 inline
60 ::Expander( const Object & object, const Point & p )
61  : myEmbeddingDomain( object.pointSet().domain() ),
62  myObject( object ),
63  myObjectDomain( object.pointSet() ),
64  myObjectAdjacency( myObjectDomain, object.adjacency() ),
65  myCore( myEmbeddingDomain ),
66  myLayer( myEmbeddingDomain ),
67  myDistance( 0 ), myFinished( false ),
68  myInCorePred( myCore ),
69  myNotInCorePred( myInCorePred )
70 {
71  ASSERT( myObjectDomain.isInside( p ) );
72  myCore.insertNew( p );
74 }
75 
87 template <typename TObject>
88 template <typename PointInputIterator>
89 inline
91 ::Expander( const Object & object,
92  PointInputIterator b, PointInputIterator e )
93  : myEmbeddingDomain( object.pointSet().domain() ),
94  myObject( object ),
95  myObjectDomain( object.pointSet() ),
96  myObjectAdjacency( myObjectDomain, object.adjacency() ),
97  myCore( myEmbeddingDomain ),
98  myLayer( myEmbeddingDomain ),
99  myDistance( 0 ), myFinished( false ),
100  myInCorePred( myCore ),
101  myNotInCorePred( myInCorePred )
102 {
103  myCore.insertNew( b, e );
105 }
106 
107 
111 template <typename TObject>
112 inline
113 bool
115 {
116  return myFinished;
117 }
118 
123 template <typename TObject>
124 inline
127 {
128  return myDistance;
129 }
130 
131 
139 template <typename TObject>
140 inline
141 bool
144 {
145  endLayer();
146  computeNextLayer( myLayer );
147  return ! finished();
148 }
149 
154 template <typename TObject>
155 inline
156 void
159 {
160  myCore.insertNew( myLayer.begin(), myLayer.end() );
161 }
162 
171 template <typename TObject>
172 inline
173 void
176 {
177  if ( finished() ) return;
178 
179  ConstIterator p = src.begin();
180  ConstIterator pEnd = src.end();
181  typedef std::set<Point> SetContainer;
182  typedef std::insert_iterator< SetContainer > Inserter;
183  typedef std::vector<Point> VectorContainer;
184  typedef std::back_insert_iterator< VectorContainer > VectorInserter;
185  SetContainer newLayer;
186  Inserter inserter( newLayer, newLayer.begin() );
187 
188  // const ObjectDomainPredicate & objectPred = myObjectDomain.predicate();
189  typedef typename ObjectDomain::Predicate ObjectDomainPredicate;
190  typedef BinaryPointPredicate< ObjectDomainPredicate,
191  NotInCoreDomainPredicate > Predicate;
192 
193  Predicate cPred( myObjectDomain.predicate(),
194  myNotInCorePred,
195  andBF2 );
196  // Computes the 1-neighborhood of the core.
197  for ( ; p != pEnd; ++p )
198  {
199  myObjectAdjacency.writeNeighbors
200  ( inserter, *p, cPred );
201  // std::cerr << *p;
202  // for ( unsigned int i = 0; i < v.size(); ++i )
203  // {
204  // std::cerr << " " << v[ i ];
205  // newLayer.insert( v[ i ] );
206  // }
207  // std::cerr << std::endl;
208  // v.clear();
209  }
210  // std::cerr << "Core.size=" << myCore.size()
211  // << " prevLayer.size=" << src.size()
212  // << " nextLayer.size=" << newLayer.size()
213  // << std::endl;
214  // Termination test.
215  if ( newLayer.empty() )
216  myFinished = true;
217  else
218  {
219  myDistance++;
220  myLayer.clear();
221  myLayer.insertNew( newLayer.begin(), newLayer.end() );
222  }
223 }
224 
225 
229 template <typename TObject>
230 inline
233 ::core() const
234 {
235  return myCore;
236 }
237 
241 template <typename TObject>
242 inline
245 ::layer() const
246 {
247  return myLayer;
248 }
249 
253 template <typename TObject>
254 inline
257 ::begin() const
258 {
259  return myLayer.begin();
260 }
261 
265 template <typename TObject>
266 inline
269 ::end() const
270 {
271  return myLayer.end();
272 }
273 
274 
276 // Interface - public :
277 
282 template <typename TObject>
283 inline
284 void
285 DGtal::Expander<TObject>::selfDisplay ( std::ostream & out ) const
286 {
287  out << "[Expander layer=" << myDistance
288  << " layer.size=" << myLayer.size()
289  << " finished=" << myFinished
290  << " ]";
291 }
292 
297 template <typename TObject>
298 inline
299 bool
301 {
302  return true;
303 }
304 
305 
306 
308 // Implementation of inline functions //
309 
310 template <typename TObject>
311 inline
312 std::ostream&
313 DGtal::operator<< ( std::ostream & out,
314  const Expander<TObject> & object )
315 {
316  object.selfDisplay( out );
317  return out;
318 }
319 
320 // //
322 
323