1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
6 #ifndef __fpa__Base__Algorithm__hxx__
7 #define __fpa__Base__Algorithm__hxx__
9 // -------------------------------------------------------------------------
10 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
11 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
17 // -------------------------------------------------------------------------
18 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
19 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
20 TEvent( const TVertex& v, unsigned long fid, bool intoq )
28 // -------------------------------------------------------------------------
29 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
30 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
35 // -------------------------------------------------------------------------
36 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
38 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
41 return( "fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent" );
44 // -------------------------------------------------------------------------
45 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
47 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
48 CheckEvent( const itk::EventObject* e ) const
50 return( dynamic_cast< const Self* >( e ) != NULL );
53 // -------------------------------------------------------------------------
54 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
56 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
62 // -------------------------------------------------------------------------
63 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
64 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
65 InvokeEvent( const itk::EventObject& e )
68 if( a.CheckEvent( &e ) )
70 if( this->m_VisualDebug )
71 this->Superclass::InvokeEvent( e );
74 this->Superclass::InvokeEvent( e );
77 // -------------------------------------------------------------------------
78 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
79 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
80 InvokeEvent( const itk::EventObject& e ) const
83 if( a.CheckEvent( &e ) )
85 if( this->m_VisualDebug )
86 this->Superclass::InvokeEvent( e );
89 this->Superclass::InvokeEvent( e );
92 // -------------------------------------------------------------------------
93 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
94 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
97 _TMarksInterface( this ),
98 _TSeedsInterface( this ),
99 m_VisualDebug( false )
103 // -------------------------------------------------------------------------
104 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
105 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
110 // -------------------------------------------------------------------------
111 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
112 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
115 this->InvokeEvent( itk::StartEvent( ) );
118 this->_BeforeGenerateData( );
119 this->_ConfigureOutput( this->m_InitValue );
120 this->_InitMarks( this->GetSeeds( ).size( ) );
121 TNodes seeds = this->_UnifySeeds( );
122 this->_PrepareSeeds( seeds );
126 typename TNodes::const_iterator sIt = seeds.begin( );
127 for( ; sIt != seeds.end( ); ++sIt )
129 this->_QueuePush( *sIt );
130 this->InvokeEvent( TEvent( sIt->Vertex, sIt->FrontId, true ) );
135 while( this->_QueueSize( ) > 0 )
137 // Get next candidate
138 TNode node = this->_QueuePop( );
139 this->InvokeEvent( TEvent( node.Vertex, node.FrontId, false ) );
140 if( !( this->_IsMarked( node.Vertex ) ) )
142 // Update output value and mark vertex
143 this->_UpdateOutputValue( node );
144 this->_Mark( node.Vertex, node.FrontId );
146 // The actual node was effectively marked?
147 if( node.FrontId > 0 )
150 TNeighborhood neighbors = this->_GetNeighbors( node.Vertex );
151 typename TNeighborhood::const_iterator nIt = neighbors.begin( );
153 while( nIt != neighbors.end( ) && !coll )
155 if( this->_IsMarked( *nIt ) )
157 // Invoke stop at collisions
158 if( this->_Collisions( node.Vertex, *nIt ) )
160 this->_QueueClear( );
169 nnode.Parent = node.Vertex;
170 nnode.FrontId = node.FrontId;
171 this->_ComputeOutputValue( nnode );
172 this->_QueuePush( nnode );
173 this->InvokeEvent( TEvent( nnode.Vertex, nnode.FrontId, true ) );
183 this->_FinishOneLoop( );
188 this->_AfterGenerateData( );
189 this->InvokeEvent( itk::EndEvent( ) );
192 // -------------------------------------------------------------------------
193 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
194 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
195 _BeforeGenerateData( )
199 // -------------------------------------------------------------------------
200 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
201 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
202 _AfterGenerateData( )
206 // -------------------------------------------------------------------------
207 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
208 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
213 // -------------------------------------------------------------------------
214 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
215 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
218 this->_QueueClear( );
221 #endif // __fpa__Base__Algorithm__hxx__