32 #include "DGtal/kernel/CPointPredicate.h"
33 #include "DGtal/topology/CSurfelPredicate.h"
44 template <
typename TKSpace>
50 template <
typename TKSpace>
54 : mySpace( 0 ), mySurfelAdj( 0 )
57 template <
typename TKSpace>
61 : mySpace( other.mySpace ), mySurfelAdj( other.mySurfelAdj ),
62 mySurfel( other.mySurfel ), myOrthDir( other.myOrthDir ),
63 myOrthDirect( other.myOrthDirect )
66 template <
typename TKSpace>
83 template <
typename TKSpace>
89 const SCell & aSurfel )
94 myOrthDir = mySpace->sOrthDir( aSurfel );
95 myOrthDirect = mySpace->sDirect( aSurfel, myOrthDir );
99 template <
typename TKSpace>
105 ASSERT( mySpace != 0 );
106 if ( mySurfel != aSurfel )
109 myOrthDir = mySpace->sOrthDir( aSurfel );
110 myOrthDirect = mySpace->sDirect( aSurfel, myOrthDir );
114 template <
typename TKSpace>
123 template <
typename TKSpace>
135 template <
typename TKSpace>
141 ASSERT( mySpace != 0 );
142 return mySpace->sIncident( surfel(), orthDir(), myOrthDirect );
145 template <
typename TKSpace>
151 ASSERT( mySpace != 0 );
152 return mySpace->sIncident( surfel(), orthDir(), ! myOrthDirect );
155 template <
typename TKSpace>
161 ASSERT( ( mySpace != 0 ) && ( track_dir != myOrthDir ) );
162 return mySpace->sAdjacent( innerSpel(), track_dir, pos );
165 template <
typename TKSpace>
171 ASSERT( ( mySpace != 0 ) && ( track_dir != myOrthDir ) );
172 return mySpace->sAdjacent( outerSpel(), track_dir, pos );
178 template <
typename TKSpace>
184 ASSERT( ( mySpace != 0 ) && ( track_dir != myOrthDir ) );
185 return mySpace->sIncident( innerSpel(), track_dir, pos );
188 template <
typename TKSpace>
194 ASSERT( ( mySpace != 0 ) && ( track_dir != myOrthDir ) );
195 return mySpace->sAdjacent( surfel(), track_dir, pos );
201 template <
typename TKSpace>
207 ASSERT( ( mySpace != 0 ) && ( track_dir != myOrthDir ) );
208 return mySpace->sIncident( outerSpel(), track_dir, pos );
214 template <
typename TKSpace>
215 template <
typename SpelSet>
225 ASSERT( mySpace != 0 );
226 ASSERT( mySurfelAdj != 0 );
227 Cell uinner_spel = mySpace->unsigns( innerSpel() );
228 ASSERT( obj.find( uinner_spel ) != obj.end() );
229 ASSERT( obj.find( mySpace->unsigns( outerSpel() ) ) == obj.end() );
232 if ( ( pos && mySpace->uisMax( uinner_spel, track_dir ) )
233 || ( ( ! pos ) && mySpace->uisMin( uinner_spel, track_dir ) ) )
236 if ( mySurfelAdj->getAdjacency( orthDir(), track_dir ) )
239 if ( obj.find( mySpace->unsigns( innerAdjacentSpel( track_dir, pos ) ) )
242 adj_surfel = follower1( track_dir, pos );
246 if ( obj.find( mySpace->unsigns( outerAdjacentSpel( track_dir, pos ) ) )
249 adj_surfel = follower2( track_dir, pos );
253 adj_surfel = follower3( track_dir, pos );
259 if ( obj.find( mySpace->unsigns( outerAdjacentSpel( track_dir, pos ) ) )
262 adj_surfel = follower3( track_dir, pos );
266 if ( obj.find( mySpace->unsigns( innerAdjacentSpel( track_dir, pos ) ) )
269 adj_surfel = follower2( track_dir, pos );
273 adj_surfel = follower1( track_dir, pos );
278 template <
typename TKSpace>
279 template <
typename DigitalSet>
284 const DigitalSet & obj,
289 ASSERT( mySpace != 0 );
290 ASSERT( mySurfelAdj != 0 );
291 Point inner_spel_pt = mySpace->sCoords( innerSpel() );
292 ASSERT( obj.find( inner_spel_pt ) != obj.end() );
293 ASSERT( obj.find( mySpace->sCoords( outerSpel() ) ) == obj.end() );
296 if ( ( pos && ( inner_spel_pt[ track_dir ] == mySpace->max( track_dir ) ) )
298 ( (!pos) && ( inner_spel_pt[ track_dir ] == mySpace->min( track_dir ) ) )
302 if ( mySurfelAdj->getAdjacency( orthDir(), track_dir ) )
305 if ( obj.find( mySpace->sCoords( innerAdjacentSpel( track_dir, pos ) ) )
308 adj_surfel = follower1( track_dir, pos );
312 if ( obj.find( mySpace->sCoords( outerAdjacentSpel( track_dir, pos ) ) )
315 adj_surfel = follower2( track_dir, pos );
319 adj_surfel = follower3( track_dir, pos );
325 if ( obj.find( mySpace->sCoords( outerAdjacentSpel( track_dir, pos ) ) )
328 adj_surfel = follower3( track_dir, pos );
332 if ( obj.find( mySpace->sCoords( innerAdjacentSpel( track_dir, pos ) ) )
335 adj_surfel = follower2( track_dir, pos );
339 adj_surfel = follower1( track_dir, pos );
346 template <
typename TKSpace>
347 template <
typename Po
intPredicate>
351 const PointPredicate & pp,
358 ASSERT( mySpace != 0 );
359 ASSERT( mySurfelAdj != 0 );
360 Point inner_spel_pt = mySpace->sCoords( innerSpel() );
361 ASSERT( pp( inner_spel_pt ) &&
"Should be inside." );
362 ASSERT( ! pp( mySpace->sCoords( outerSpel() ) ) &&
"Should be outside" );
365 if ( ( pos && ( inner_spel_pt[ track_dir ] == mySpace->max( track_dir ) ) )
367 ( (!pos) && ( inner_spel_pt[ track_dir ] == mySpace->min( track_dir ) ) )
371 if ( mySurfelAdj->getAdjacency( orthDir(), track_dir ) )
374 if ( ! pp( mySpace->sCoords( innerAdjacentSpel( track_dir, pos ) ) ) )
376 adj_surfel = follower1( track_dir, pos );
380 if ( ! pp( mySpace->sCoords( outerAdjacentSpel( track_dir, pos ) ) ) )
382 adj_surfel = follower2( track_dir, pos );
386 adj_surfel = follower3( track_dir, pos );
392 if ( pp( mySpace->sCoords( outerAdjacentSpel( track_dir, pos ) ) ) )
394 adj_surfel = follower3( track_dir, pos );
398 if ( pp( mySpace->sCoords( innerAdjacentSpel( track_dir, pos ) ) ) )
400 adj_surfel = follower2( track_dir, pos );
404 adj_surfel = follower1( track_dir, pos );
410 template <
typename TKSpace>
411 template <
typename SurfelPredicate>
415 const SurfelPredicate & sp,
420 typedef typename KSpace::Integer Integer;
423 ASSERT( mySpace != 0 );
424 ASSERT( mySurfelAdj != 0 );
425 ASSERT( sp( mySurfel ) &&
"Current surfel should satisfy predicate." );
428 Integer x_track = mySpace->sCoord( surfel(), track_dir );
429 if ( ( pos && ( x_track == mySpace->max( track_dir ) ) )
431 ( (!pos) && ( x_track == mySpace->min( track_dir ) ) )
435 SCell tmp_surfel = adj_surfel;
438 if ( mySurfelAdj->getAdjacency( orthDir(), track_dir ) )
444 adj_surfel = follower1( track_dir, pos );
445 if ( sp( adj_surfel ) )
return 1;
451 adj_surfel = follower2( track_dir, pos );
452 if ( sp( adj_surfel ) )
return 2;
458 adj_surfel = follower3( track_dir, pos );
459 if ( sp( adj_surfel ) )
return 3;
468 adj_surfel = follower3( track_dir, pos );
469 if ( sp( adj_surfel ) )
return 3;
475 adj_surfel = follower2( track_dir, pos );
476 if ( sp( adj_surfel ) )
return 2;
482 adj_surfel = follower1( track_dir, pos );
483 if ( sp( adj_surfel ) )
return 1;
486 adj_surfel = tmp_surfel;
494 template <
typename TKSpace>
499 out <<
"[SurfelNeighborhood]";
502 template <
typename TKSpace>
513 template <
typename TKSpace>
519 object.selfDisplay( out );