42 template <
typename TDigitalSurfaceTracker>
46 if ( myTracker != 0 )
delete myTracker;
49 template <
typename TDigitalSurfaceTracker>
56 template <
typename TDigitalSurfaceTracker>
69 template <
typename TDigitalSurfaceTracker>
91 template <
typename TDigitalSurfaceTracker>
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();
104 myState.epsilon = epsilon;
108 template <
typename TDigitalSurfaceTracker>
114 ASSERT( myTracker != 0 );
118 template <
typename TDigitalSurfaceTracker>
123 ASSERT( myTracker != 0 );
124 myTracker->move( aState.
surfel );
128 template <
typename TDigitalSurfaceTracker>
136 template <
typename TDigitalSurfaceTracker>
141 return myTracker->surface().
space();
146 template <
typename TDigitalSurfaceTracker>
151 ASSERT( myTracker != 0 );
152 ASSERT( myTracker->current() == myState.surfel );
153 return myState.surfel;
156 template <
typename TDigitalSurfaceTracker>
161 ASSERT( myTracker != 0 );
162 return space().sIncident( surfel(),
164 separatorOrientation() );
167 template <
typename TDigitalSurfaceTracker>
172 ASSERT( myTracker != 0 );
173 return space()->sDirectIncident( separator(), trackDir() );
176 template <
typename TDigitalSurfaceTracker>
181 ASSERT( myTracker != 0 );
182 return myTracker->orthDir();
185 template <
typename TDigitalSurfaceTracker>
193 template <
typename TDigitalSurfaceTracker>
198 return space().sDirect( separator(), trackDir() );
201 template <
typename TDigitalSurfaceTracker>
209 template <
typename TDigitalSurfaceTracker>
214 return myState.epsilon;
219 template <
typename TDigitalSurfaceTracker>
224 ASSERT( myTracker != 0 );
228 bool mu = trackOrientation();
230 unsigned int code = myTracker->adjacent( sp, j, mu );
234 SCell s = myTracker->current();
235 myState.j = myState.k;
236 myTracker->move( sp );
240 bool track_direct_orientation
241 = space().sDirect( s, j );
242 bool nu = space().sDirect( sp, i );
244 myState.epsilon = ( mu == track_direct_orientation ) ^ nu;
250 myState.epsilon = ! mu;
256 template <
typename TDigitalSurfaceTracker>
261 ASSERT( myTracker != 0 );
277 bool mu = trackOrientation();
279 unsigned int code = myTracker->adjacent( sp, separatorDir(),
280 separatorOrientation() );
286 myTracker->move( sp );
289 myState.epsilon = mu;
290 myState.j = ( code != 2 )
309 template <
typename TDigitalSurfaceTracker>
314 ASSERT( myTracker != 0 );
316 if ( previous() == 0 )
return false;
317 bool mu = trackOrientation();
318 myState.k = myState.j;
319 myState.epsilon = mu;
331 template <
typename TDigitalSurfaceTracker>
336 out <<
"[UmbrellaComputer]";
343 template <
typename TDigitalSurfaceTracker>
356 template <
typename TDigitalSurfaceTracker>
362 object.selfDisplay( out );