// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __fpa__Base__Algorithm__hxx__ #define __fpa__Base__Algorithm__hxx__ // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent:: TEvent( ) : Superclass( ) { } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent:: TEvent( const TVertex& v, unsigned long fid, bool intoq ) : Superclass( ), Vertex( v ), FrontId( fid ), IntoQueue( intoq ) { } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent:: ~TEvent( ) { } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > const char* fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent:: GetEventName( ) const { return( "fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent" ); } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > bool fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent:: CheckEvent( const itk::EventObject* e ) const { return( dynamic_cast< const Self* >( e ) != NULL ); } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > itk::EventObject* fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent:: MakeObject( ) const { return( new Self ); } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >:: InvokeEvent( const itk::EventObject& e ) { TEvent a; if( a.CheckEvent( &e ) ) { if( this->m_VisualDebug ) this->Superclass::InvokeEvent( e ); } else this->Superclass::InvokeEvent( e ); } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >:: InvokeEvent( const itk::EventObject& e ) const { TEvent a; if( a.CheckEvent( &e ) ) { if( this->m_VisualDebug ) this->Superclass::InvokeEvent( e ); } else this->Superclass::InvokeEvent( e ); } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >:: Algorithm( ) : Superclass( ), _TMarksInterface( this ), _TSeedsInterface( this ), m_VisualDebug( false ) { } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >:: ~Algorithm( ) { } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >:: GenerateData( ) { this->InvokeEvent( itk::StartEvent( ) ); // Init objects this->_BeforeGenerateData( ); this->_ConfigureOutput( this->m_InitValue ); this->_InitMarks( this->GetSeeds( ).size( ) ); TNodes seeds = this->_UnifySeeds( ); this->_PrepareSeeds( seeds ); // Init queue this->_QueueInit( ); typename TNodes::const_iterator sIt = seeds.begin( ); for( ; sIt != seeds.end( ); ++sIt ) { this->_QueuePush( *sIt ); this->InvokeEvent( TEvent( sIt->Vertex, sIt->FrontId, true ) ); } // rof // Main loop while( this->_QueueSize( ) > 0 ) { // Get next candidate TNode node = this->_QueuePop( ); this->InvokeEvent( TEvent( node.Vertex, node.FrontId, false ) ); if( !( this->_IsMarked( node.Vertex ) ) ) { // Mark it if( this->_Mark( node.Vertex, node.FrontId ) ) { // Update output value this->_UpdateOutputValue( node ); // Add neighborhood TNeighborhood neighbors = this->_GetNeighbors( node.Vertex ); typename TNeighborhood::const_iterator nIt = neighbors.begin( ); bool coll = false; while( nIt != neighbors.end( ) && !coll ) { if( this->_IsMarked( *nIt ) ) { // Invoke stop at collisions if( this->_Collisions( node.Vertex, *nIt ) ) { this->_QueueClear( ); coll = true; } // fi } else { TNode nnode; nnode.Vertex = *nIt; nnode.Parent = node.Vertex; nnode.FrontId = node.FrontId; if( this->_ComputeOutputValue( nnode ) ) { this->_QueuePush( nnode ); this->InvokeEvent( TEvent( nnode.Vertex, nnode.FrontId, true ) ); } // fi } // fi ++nIt; } // elihw } // fi } // fi this->_FinishOneLoop( ); } // elihw // Finish this->_AfterGenerateData( ); this->InvokeEvent( itk::EndEvent( ) ); } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >:: _BeforeGenerateData( ) { } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >:: _AfterGenerateData( ) { } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >:: _FinishOneLoop( ) { } // ------------------------------------------------------------------------- template< class _TFilter, class _TMarksInterface, class _TSeedsInterface > void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >:: _QueueInit( ) { this->_QueueClear( ); } #endif // __fpa__Base__Algorithm__hxx__ // eof - $RCSfile$