X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FFilters%2FMarksWithCollisionsInterface.hxx;fp=lib%2Ffpa%2FFilters%2FMarksWithCollisionsInterface.hxx;h=9a9852c34cd2a0b9200ca65158f1228a672390af;hb=2047276c8f1a02432fbcc7014722d460d6c1e60f;hp=0000000000000000000000000000000000000000;hpb=3c639e5da479c7216a0a302ffa156ac6762caeed;p=FrontAlgorithms.git diff --git a/lib/fpa/Filters/MarksWithCollisionsInterface.hxx b/lib/fpa/Filters/MarksWithCollisionsInterface.hxx new file mode 100644 index 0000000..9a9852c --- /dev/null +++ b/lib/fpa/Filters/MarksWithCollisionsInterface.hxx @@ -0,0 +1,131 @@ +// ========================================================================= +// @author Leonardo Florez Valencia +// @email florez-l@javeriana.edu.co +// ========================================================================= +#ifndef __fpa__Filters__MarksWithCollisionsInterface__hxx__ +#define __fpa__Filters__MarksWithCollisionsInterface__hxx__ + +#include + +// ------------------------------------------------------------------------- +template< class _TTraits > +fpa::Filters::MarksWithCollisionsInterface< _TTraits >:: +MarksWithCollisionsInterface( itk::ProcessObject* f ) + : Superclass( f ), + m_StopAtOneFront( false ), + m_NumberOfFronts( 0 ), + m_NumberOfSeeds( 0 ) +{ +} + +// ------------------------------------------------------------------------- +template< class _TTraits > +fpa::Filters::MarksWithCollisionsInterface< _TTraits >:: +~MarksWithCollisionsInterface( ) +{ +} + +// ------------------------------------------------------------------------- +template< class _TTraits > +bool fpa::Filters::MarksWithCollisionsInterface< _TTraits >:: +StopAtOneFront( ) const +{ + return( this->m_StopAtOneFront ); +} + +// ------------------------------------------------------------------------- +template< class _TTraits > +void fpa::Filters::MarksWithCollisionsInterface< _TTraits >:: +StopAtOneFrontOn( ) +{ + this->SetStopAtOneFront( true ); +} + +// ------------------------------------------------------------------------- +template< class _TTraits > +void fpa::Filters::MarksWithCollisionsInterface< _TTraits >:: +StopAtOneFrontOff( ) +{ + this->SetStopAtOneFront( false ); +} + +// ------------------------------------------------------------------------- +template< class _TTraits > +void fpa::Filters::MarksWithCollisionsInterface< _TTraits >:: +SetStopAtOneFront( bool v ) +{ + if( this->m_StopAtOneFront != v ) + { + this->m_StopAtOneFront = v; + if( this->m_Filter != NULL ) + this->m_Filter->Modified( ); + + } // fi +} + +// ------------------------------------------------------------------------- +template< class _TTraits > +void fpa::Filters::MarksWithCollisionsInterface< _TTraits >:: +_InitCollisions( unsigned long nSeeds ) +{ + this->m_NumberOfFronts = this->m_NumberOfSeeds = nSeeds; + TCollision coll( TVertex( ), false ); + TCollisionsRow row( this->m_NumberOfFronts, coll ); + this->m_Collisions.clear( ); + this->m_Collisions.resize( this->m_NumberOfFronts, row ); +} + +// ------------------------------------------------------------------------- +template< class _TTraits > +bool fpa::Filters::MarksWithCollisionsInterface< _TTraits >:: +_Collisions( const TVertex& a, const TVertex& b ) +{ + unsigned long ma = this->_GetMark( a ); + unsigned long mb = this->_GetMark( b ); + if( ma == mb || ma == 0 || mb == 0 ) + return( false ); + + // Mark collision, if it is new + ma--; mb--; + bool ret = false; + bool exists = this->m_Collisions[ ma ][ mb ].second; + exists &= this->m_Collisions[ mb ][ ma ].second; + if( !exists ) + { + this->m_Collisions[ ma ][ mb ].first = a; + this->m_Collisions[ ma ][ mb ].second = true; + this->m_Collisions[ mb ][ ma ].first = b; + this->m_Collisions[ mb ][ ma ].second = true; + + // Update number of fronts + unsigned long count = 0; + std::vector< bool > m( this->m_NumberOfSeeds, false ); + std::queue< unsigned long > q; + q.push( 0 ); + while( !q.empty( ) ) + { + unsigned long f = q.front( ); + q.pop( ); + + if( m[ f ] ) + continue; + m[ f ] = true; + count++; + + for( unsigned int n = 0; n < this->m_NumberOfSeeds; ++n ) + if( this->m_Collisions[ f ][ n ].second && !m[ n ] ) + q.push( n ); + + } // elihw + this->m_NumberOfFronts = this->m_NumberOfSeeds - count + 1; + + } // fi + return( + this->m_StopAtOneFront && + this->m_NumberOfSeeds > 1 && + this->m_NumberOfFronts == 1 + ); +} + +#endif // __fpa__Filters__MarksWithCollisionsInterface__hxx__ +// eof - $RCSfile$