DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
ExplicitDigitalSurface.ih
1 
30 
31 #include <cstdlib>
32 #include <iterator>
33 #include "DGtal/kernel/sets/SetPredicate.h"
34 #include "DGtal/topology/helpers/Surfaces.h"
36 
38 // IMPLEMENTATION of inline methods.
40 
41 //-----------------------------------------------------------------------------
42 template <typename TKSpace, typename TSurfelPredicate>
43 inline
46 {}
47 //-----------------------------------------------------------------------------
48 template <typename TKSpace, typename TSurfelPredicate>
49 inline
52  const Surfel & s )
53  : mySurface( aSurface ), myNeighborhood()
54 {
57  s );
58 }
59 //-----------------------------------------------------------------------------
60 template <typename TKSpace, typename TSurfelPredicate>
61 inline
63 ::Tracker( const Tracker & other )
64  : mySurface( other.mySurface ), myNeighborhood( other.myNeighborhood )
65 {
66 }
67 //-----------------------------------------------------------------------------
68 template <typename TKSpace, typename TSurfelPredicate>
69 inline
71 ::DigitalSurfaceContainer &
73 ::surface() const
74 {
75  return mySurface;
76 }
77 //-----------------------------------------------------------------------------
78 template <typename TKSpace, typename TSurfelPredicate>
79 inline
81 ::Surfel &
83 ::current() const
84 {
85  return myNeighborhood.surfel();
86 }
87 //-----------------------------------------------------------------------------
88 template <typename TKSpace, typename TSurfelPredicate>
89 inline
92 ::orthDir() const
93 {
94  return myNeighborhood.orthDir();
95 }
96 //-----------------------------------------------------------------------------
97 template <typename TKSpace, typename TSurfelPredicate>
98 inline
99 void
101 ::move( const Surfel & s )
102 {
103  ASSERT( surface().isInside( s ) );
104  myNeighborhood.setSurfel( s );
105 }
106 //-----------------------------------------------------------------------------
107 template <typename TKSpace, typename TSurfelPredicate>
108 inline
111 ::adjacent( Surfel & s, Dimension d, bool pos ) const
112 {
113  return static_cast<uint8_t>
114  ( myNeighborhood.getAdjacentOnSurfelPredicate
115  ( s, surface().surfelPredicate(), d, pos ) );
116 }
117 
119 // ----------------------- Standard services ------------------------------
120 
121 //-----------------------------------------------------------------------------
122 template <typename TKSpace, typename TSurfelPredicate>
123 inline
125 {
126 }
127 //-----------------------------------------------------------------------------
128 template <typename TKSpace, typename TSurfelPredicate>
129 inline
131 ( const ExplicitDigitalSurface & other )
132  : myKSpace( other.myKSpace ),
135  mySurfels( other.mySurfels )
136 {
137 }
138 //-----------------------------------------------------------------------------
139 template <typename TKSpace, typename TSurfelPredicate>
140 inline
142 ( const KSpace & aKSpace,
143  const SurfelPredicate & aPP,
144  const Adjacency & adj,
145  const Surfel & s,
146  bool closed )
147  : myKSpace( aKSpace ), mySurfelPredicate( aPP ), mySurfelAdjacency( adj )
148 {
149  computeSurfels( s, closed );
150 }
151 //-----------------------------------------------------------------------------
152 template <typename TKSpace, typename TSurfelPredicate>
153 inline
154 const
157 {
158  return mySurfelAdjacency;
159 }
160 //-----------------------------------------------------------------------------
161 template <typename TKSpace, typename TSurfelPredicate>
162 inline
165 {
166  return mySurfelAdjacency;
167 }
168 //-----------------------------------------------------------------------------
169 template <typename TKSpace, typename TSurfelPredicate>
170 inline
171 const
174 {
175  return mySurfelPredicate;
176 }
177 
178 //-----------------------------------------------------------------------------
179 // --------- CDigitalSurfaceContainer realization -------------------------
180 //-----------------------------------------------------------------------------
181 template <typename TKSpace, typename TSurfelPredicate>
182 inline
185 {
186  return myKSpace;
187 }
188 //-----------------------------------------------------------------------------
189 template <typename TKSpace, typename TSurfelPredicate>
190 inline
191 bool
193 ( const Surfel & s ) const
194 {
195  return surfelPredicate()( s );
196 }
197 //-----------------------------------------------------------------------------
198 template <typename TKSpace, typename TSurfelPredicate>
199 inline
202 {
203  return mySurfels.begin();
204 }
205 //-----------------------------------------------------------------------------
206 template <typename TKSpace, typename TSurfelPredicate>
207 inline
210 {
211  return mySurfels.end();
212 }
213 //-----------------------------------------------------------------------------
214 template <typename TKSpace, typename TSurfelPredicate>
215 inline
218 {
219  return mySurfels.size();
220 }
221 //-----------------------------------------------------------------------------
222 template <typename TKSpace, typename TSurfelPredicate>
223 inline
224 bool
226 {
227  return mySurfels.empty();
228 }
229 //-----------------------------------------------------------------------------
230 template <typename TKSpace, typename TSurfelPredicate>
231 inline
234 ( const Surfel & s ) const
235 {
236  return new Tracker( *this, s );
237 }
238 //-----------------------------------------------------------------------------
239 template <typename TKSpace, typename TSurfelPredicate>
240 inline
243 {
244  return CONNECTED;
245 }
246 
247 // ------------------------- Hidden services ------------------------------
248 //-----------------------------------------------------------------------------
249 template <typename TKSpace, typename TSurfelPredicate>
250 inline
251 void
253 ( const Surfel & p, bool closed )
254 {
255  mySurfels.clear();
256  if ( KSpace::dimension > 2 )
257  {
258  typename KSpace::SCellSet surface;
259  if ( closed )
261  myKSpace,
264  p );
265  else
267  myKSpace,
270  p );
271  for ( typename KSpace::SCellSet::const_iterator it = surface.begin(),
272  it_end = surface.end(); it != it_end; ++it )
273  mySurfels.push_back( *it );
274  }
275  else
276  {
277  ASSERT( KSpace::dimension == 2 );
279  myKSpace,
282  p );
283  }
284 }
285 
287 // Interface - public :
288 
293 template <typename TKSpace, typename TSurfelPredicate>
294 inline
295 void
297 {
298  out << "[ExplicitDigitalSurface]";
299 }
300 
305 template <typename TKSpace, typename TSurfelPredicate>
306 inline
307 bool
309 {
310  return true;
311 }
312 
313 
314 
316 // Implementation of inline functions //
317 
318 template <typename TKSpace, typename TSurfelPredicate>
319 inline
320 std::ostream&
321 DGtal::operator<< ( std::ostream & out,
323 {
324  object.selfDisplay( out );
325  return out;
326 }
327 
328 // //
330 
331