// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __fpa__Base__MarksInterface__hxx__ #define __fpa__Base__MarksInterface__hxx__ #include // ------------------------------------------------------------------------- template< class _TVertex > bool fpa::Base::MarksInterface< _TVertex >:: StopAtOneFront( ) const { return( this->m_StopAtOneFront ); } // ------------------------------------------------------------------------- template< class _TVertex > void fpa::Base::MarksInterface< _TVertex >:: StopAtOneFrontOn( ) { this->SetStopAtOneFront( true ); } // ------------------------------------------------------------------------- template< class _TVertex > void fpa::Base::MarksInterface< _TVertex >:: StopAtOneFrontOff( ) { this->SetStopAtOneFront( false ); } // ------------------------------------------------------------------------- template< class _TVertex > void fpa::Base::MarksInterface< _TVertex >:: SetStopAtOneFront( bool v ) { if( this->m_StopAtOneFront != v ) { this->m_StopAtOneFront = v; if( this->m_Filter != NULL ) this->m_Filter->Modified( ); } // fi } // ------------------------------------------------------------------------- template< class _TVertex > fpa::Base::MarksInterface< _TVertex >:: MarksInterface( itk::ProcessObject* filter ) : m_StopAtOneFront( false ), m_NumberOfFronts( 0 ), m_NumberOfSeeds( 0 ), m_Filter( filter ) { } // ------------------------------------------------------------------------- template< class _TVertex > fpa::Base::MarksInterface< _TVertex >:: ~MarksInterface( ) { } // ------------------------------------------------------------------------- template< class _TVertex > void fpa::Base::MarksInterface< _TVertex >:: _InitMarks( 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 _TVertex > unsigned long fpa::Base::MarksInterface< _TVertex >:: _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( this->m_NumberOfFronts ); // 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_NumberOfFronts ); } #endif // __fpa__Base__MarksInterface__hxx__ // eof - $RCSfile$