#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 )
+ _TSeedsInterface( this ),
+ m_VisualDebug( false )
{
}
void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
GenerateData( )
{
+ this->InvokeEvent( itk::StartEvent( ) );
+
// Init objects
+ this->_BeforeGenerateData( );
this->_ConfigureOutput( this->m_InitValue );
- this->_InitMarks( );
+ this->_InitMarks( this->GetSeeds( ).size( ) );
+ TNodes seeds = this->_UnifySeeds( );
+ this->_PrepareSeeds( seeds );
// Init queue
this->_QueueInit( );
- typename TSeeds::const_iterator sIt = this->BeginSeeds( );
- for( ; sIt != this->EndSeeds( ); ++sIt )
+ 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( );
- if( !( this->_IsMarked( node ) ) )
+ this->InvokeEvent( TEvent( node.Vertex, node.FrontId, false ) );
+ if( !( this->_IsMarked( node.Vertex ) ) )
{
// Mark it
- if( this->_Mark( node ) )
+ if( this->_Mark( node.Vertex, node.FrontId ) )
{
+ // Update output value
+ this->_UpdateOutputValue( node );
+
// Add neighborhood
- TNeighborhood neighbors = this->_GetNeighbors( node );
+ 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, *nIt ) )
+ if( this->_Collisions( node.Vertex, *nIt ) )
{
this->_QueueClear( );
coll = true;
} // fi
}
else
- this->_QueuePush( *nIt );
+ {
+ 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__