DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
UmbrellaComputer.ih
1 
30 
31 #include <cstdlib>
33 
35 // IMPLEMENTATION of inline methods.
37 
39 // ----------------------- Standard services ------------------------------
40 
41 //-----------------------------------------------------------------------------
42 template <typename TDigitalSurfaceTracker>
43 inline
45 {
46  if ( myTracker != 0 ) delete myTracker;
47 }
48 //-----------------------------------------------------------------------------
49 template <typename TDigitalSurfaceTracker>
50 inline
52  : myTracker( 0 )
53 {
54 }
55 //-----------------------------------------------------------------------------
56 template <typename TDigitalSurfaceTracker>
57 inline
60  : myTracker( 0 )
61 {
62  if ( other.myTracker != 0 )
63  {
65  myState = other.myState;
66  }
67 }
68 //-----------------------------------------------------------------------------
69 template <typename TDigitalSurfaceTracker>
70 inline
74 {
75  if ( this != &other )
76  {
77  if ( myTracker != 0 )
78  {
79  delete myTracker;
80  myTracker = 0;
81  }
82  if ( other.myTracker != 0 )
83  {
84  myTracker = new DigitalSurfaceTracker( *other.myTracker );
85  myState = other.myState;
86  }
87  }
88  return *this;
89 }
90 //-----------------------------------------------------------------------------
91 template <typename TDigitalSurfaceTracker>
92 void
94 ( const DigitalSurfaceTracker & tracker,
95  Dimension k, bool epsilon, Dimension j )
96 {
97  if ( myTracker != 0 )
98  delete myTracker;
99  myTracker = new DigitalSurfaceTracker( tracker );
100  ASSERT( space().isSpaceClosed()
101  && "[UmbrellaComputer] It is necessary to work with a closed cellular space since umbrellas use separators and pivots, which must exist for arbitrary surfels. Please build a closed KhalimskySpaceND for instance if you wish to work with faces in digital surfaces." );
102  myState.surfel = myTracker->current();
103  myState.k = k;
104  myState.epsilon = epsilon;
105  myState.j = j;
106 }
107 //-----------------------------------------------------------------------------
108 template <typename TDigitalSurfaceTracker>
109 inline
110 void
112 ( State & aState ) const
113 {
114  ASSERT( myTracker != 0 );
115  aState = myState;
116 }
117 //-----------------------------------------------------------------------------
118 template <typename TDigitalSurfaceTracker>
119 inline
120 void
122 {
123  ASSERT( myTracker != 0 );
124  myTracker->move( aState.surfel );
125  myState = aState;
126 }
127 //-----------------------------------------------------------------------------
128 template <typename TDigitalSurfaceTracker>
129 inline
132 {
133  return myState;
134 }
135 //-----------------------------------------------------------------------------
136 template <typename TDigitalSurfaceTracker>
137 inline
140 {
141  return myTracker->surface().space();
142 }
143 
145 // ----------------------- Accessor services ------------------------------
146 template <typename TDigitalSurfaceTracker>
147 inline
150 {
151  ASSERT( myTracker != 0 );
152  ASSERT( myTracker->current() == myState.surfel );
153  return myState.surfel;
154 }
155 //-----------------------------------------------------------------------------
156 template <typename TDigitalSurfaceTracker>
157 inline
160 {
161  ASSERT( myTracker != 0 );
162  return space().sIncident( surfel(),
163  separatorDir(),
164  separatorOrientation() );
165 }
166 //-----------------------------------------------------------------------------
167 template <typename TDigitalSurfaceTracker>
168 inline
171 {
172  ASSERT( myTracker != 0 );
173  return space()->sDirectIncident( separator(), trackDir() );
174 }
175 //-----------------------------------------------------------------------------
176 template <typename TDigitalSurfaceTracker>
177 inline
178 Dimension
180 {
181  ASSERT( myTracker != 0 );
182  return myTracker->orthDir();
183 }
184 //-----------------------------------------------------------------------------
185 template <typename TDigitalSurfaceTracker>
186 inline
187 Dimension
189 {
190  return myState.j;
191 }
192 //-----------------------------------------------------------------------------
193 template <typename TDigitalSurfaceTracker>
194 inline
195 bool
197 {
198  return space().sDirect( separator(), trackDir() );
199 }
200 //-----------------------------------------------------------------------------
201 template <typename TDigitalSurfaceTracker>
202 inline
203 Dimension
205 {
206  return myState.k;
207 }
208 //-----------------------------------------------------------------------------
209 template <typename TDigitalSurfaceTracker>
210 inline
211 bool
213 {
214  return myState.epsilon;
215 }
217 // ----------------------- Pivoting services ------------------------------
218 //-----------------------------------------------------------------------------
219 template <typename TDigitalSurfaceTracker>
220 inline
221 unsigned int
223 {
224  ASSERT( myTracker != 0 );
225 
226  Dimension j = trackDir();
227  // Delta^mu_t = +p
228  bool mu = trackOrientation(); // m_space->sdirect( separator(), j );
229  SCell sp;
230  unsigned int code = myTracker->adjacent( sp, j, mu );
231  if ( code != 0 )
232  { // Then the face has a successor.
233  Dimension i = orthDir();
234  SCell s = myTracker->current();
235  myState.j = myState.k; // m_track_dir = m_separator_dir;
236  myTracker->move( sp );
237  myState.surfel = sp;
238  if ( code != 2 ) // s and sp are not aligned.
239  {
240  bool track_direct_orientation
241  = space().sDirect( s, j );
242  bool nu = space().sDirect( sp, i );
243  myState.k = i; // m_separator_dir = i;
244  myState.epsilon = ( mu == track_direct_orientation ) ^ nu;
245  // m_separator_orientation = ( mu == track_direct_orientation ) ^ nu;
246  }
247  else
248  {
249  myState.k = j; //m_separator_dir = j;
250  myState.epsilon = ! mu; // m_separator_orientation = ! mu;
251  }
252  }
253  return code;
254 }
255 //-----------------------------------------------------------------------------
256 template <typename TDigitalSurfaceTracker>
257 inline
258 unsigned int
260 {
261  ASSERT( myTracker != 0 );
262 
263 // cerr << "[DGtal::UmbrellaComputer<TDigitalSurfaceTracker>::previous()] begin" << endl;
264 
265 // cerr << "(f=" << face()
266 // << ",s=" << separator()
267 // << ",p=" << pivot()
268 // << ",i=" << m_tracker->orthDir()
269 // << ",j=" << trackDir()
270 // << ",k=" << separatorDir()
271 // << ",E=" << separatorOrientation()
272 // << ")";
273 // cerr << endl;
274  Dimension j = trackDir();
275  // Delta^mu_t = +p
276  Dimension i = orthDir();
277  bool mu = trackOrientation(); // m_space->sdirect( separator(), j );
278  SCell sp;
279  unsigned int code = myTracker->adjacent( sp, separatorDir(),
280  separatorOrientation() );
281  // Kn_sid sp = m_tracker->adjacent( m_separator_dir, m_separator_orientation );
282  // cerr << "(" << face() << "," << sp << ")";
283  if ( code != 0 )
284  { // Then the face has a successor.
285  Dimension k = separatorDir();
286  myTracker->move( sp );
287  myState.surfel = sp;
288  myState.k = j;
289  myState.epsilon = mu;
290  myState.j = ( code != 2 )
291  ? i // s and sp are not aligned.
292  : k; // s and sp are aligned.
293  }
294 // cerr << "(f=" << face()
295 // << ",s=" << separator()
296 // << ",p=" << pivot()
297 // << ",i=" << m_tracker->orthDir()
298 // << ",j=" << trackDir()
299 // << ",k=" << separatorDir()
300 // << ",E=" << separatorOrientation()
301 // << ")";
302 // cerr << endl;
303 // cerr << "[DGtal::UmbrellaComputer<TDigitalSurfaceTracker>::previous()] end" << endl;
304  return code;
305 }
306 
307 
308 //-----------------------------------------------------------------------------
309 template <typename TDigitalSurfaceTracker>
310 inline
311 bool
313 {
314  ASSERT( myTracker != 0 );
315  Dimension old_j = trackDir(); // uint old_j = m_track_dir;
316  if ( previous() == 0 ) return false;
317  bool mu = trackOrientation(); // m_space->sdirect( separator(), m_track_dir );
318  myState.k = myState.j; // m_separator_dir = m_track_dir;
319  myState.epsilon = mu; // m_separator_orientation = mu;
320  myState.j = old_j; // m_track_dir = old_j;
321  return true;
322 }
323 
325 // Interface - public :
326 
331 template <typename TDigitalSurfaceTracker>
332 inline
333 void
335 {
336  out << "[UmbrellaComputer]";
337 }
338 
343 template <typename TDigitalSurfaceTracker>
344 inline
345 bool
347 {
348  return true;
349 }
350 
351 
352 
354 // Implementation of inline functions //
355 
356 template <typename TDigitalSurfaceTracker>
357 inline
358 std::ostream&
359 DGtal::operator<< ( std::ostream & out,
361 {
362  object.selfDisplay( out );
363  return out;
364 }
365 
366 // //
368 
369