]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Base/Algorithm.hxx
...
[FrontAlgorithms.git] / lib / fpa / Base / Algorithm.hxx
1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
5
6 #ifndef __fpa__Base__Algorithm__hxx__
7 #define __fpa__Base__Algorithm__hxx__
8
9 // -------------------------------------------------------------------------
10 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
11 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
12 TEvent( )
13   : Superclass( )
14 {
15 }
16
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 )
21   : Superclass( ),
22     Vertex( v ),
23     FrontId( fid ),
24     IntoQueue( intoq )
25 {
26 }
27
28 // -------------------------------------------------------------------------
29 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
30 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
31 ~TEvent( )
32 {
33 }
34
35 // -------------------------------------------------------------------------
36 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
37 const char* 
38 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
39 GetEventName( ) const
40 {
41   return( "fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent" );
42 }
43
44 // -------------------------------------------------------------------------
45 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
46 bool
47 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
48 CheckEvent( const itk::EventObject* e ) const
49 {
50   return( dynamic_cast< const Self* >( e ) != NULL );
51 }
52
53 // -------------------------------------------------------------------------
54 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
55 itk::EventObject* 
56 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
57 MakeObject( ) const
58 {
59   return( new Self );
60 }
61
62 // -------------------------------------------------------------------------
63 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
64 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
65 InvokeEvent( const itk::EventObject& e )
66 {
67   TEvent a;
68   if( a.CheckEvent( &e ) )
69   {
70     if( this->m_VisualDebug )
71       this->Superclass::InvokeEvent( e );
72   }
73   else
74     this->Superclass::InvokeEvent( e );
75 }
76
77 // -------------------------------------------------------------------------
78 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
79 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
80 InvokeEvent( const itk::EventObject& e ) const
81 {
82   TEvent a;
83   if( a.CheckEvent( &e ) )
84   {
85     if( this->m_VisualDebug )
86       this->Superclass::InvokeEvent( e );
87   }
88   else
89     this->Superclass::InvokeEvent( e );
90 }
91
92 // -------------------------------------------------------------------------
93 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
94 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
95 Algorithm( )
96   : Superclass( ),
97     _TMarksInterface( this ),
98     _TSeedsInterface( this ),
99     m_VisualDebug( false )
100 {
101 }
102
103 // -------------------------------------------------------------------------
104 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
105 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
106 ~Algorithm( )
107 {
108 }
109
110 // -------------------------------------------------------------------------
111 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
112 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
113 GenerateData( )
114 {
115   this->InvokeEvent( itk::StartEvent( ) );
116
117   // Init objects
118   this->_BeforeGenerateData( );
119   this->_ConfigureOutput( this->m_InitValue );
120   this->_InitMarks( this->GetSeeds( ).size( ) );
121   TNodes seeds = this->_UnifySeeds( );
122   this->_PrepareSeeds( seeds );
123
124   // Init queue
125   this->_QueueInit( );
126   typename TNodes::const_iterator sIt = seeds.begin( );
127   for( ; sIt != seeds.end( ); ++sIt )
128   {
129     this->_QueuePush( *sIt );
130     this->InvokeEvent( TEvent( sIt->Vertex, sIt->FrontId, true ) );
131
132   } // rof
133
134   // Main loop
135   while( this->_QueueSize( ) > 0 )
136   {
137     // Get next candidate
138     TNode node = this->_QueuePop( );
139     this->InvokeEvent( TEvent( node.Vertex, node.FrontId, false ) );
140     if( !( this->_IsMarked( node.Vertex ) ) )
141     {
142       // Mark it
143       if( this->_Mark( node.Vertex, node.FrontId ) )
144       {
145         // Update output value
146         this->_UpdateOutputValue( node );
147
148         // Add neighborhood
149         TNeighborhood neighbors = this->_GetNeighbors( node.Vertex );
150         typename TNeighborhood::const_iterator nIt = neighbors.begin( );
151         bool coll = false;
152         while( nIt != neighbors.end( ) && !coll )
153         {
154           if( this->_IsMarked( *nIt ) )
155           {
156             // Invoke stop at collisions
157             if( this->_Collisions( node.Vertex, *nIt ) )
158             {
159               this->_QueueClear( );
160               coll = true;
161
162             } // fi
163           }
164           else
165           {
166             TNode nnode;
167             nnode.Vertex = *nIt;
168             nnode.Parent = node.Vertex;
169             nnode.FrontId = node.FrontId;
170             nnode.Value = this->_ComputeOutputValue( nnode );
171             this->_QueuePush( nnode );
172             this->InvokeEvent( TEvent( nnode.Vertex, nnode.FrontId, true ) );
173
174           } // fi
175           ++nIt;
176
177         } // elihw
178
179       } // fi
180
181     } // fi
182
183   } // elihw
184
185   // Finish
186   this->_AfterGenerateData( );
187   this->InvokeEvent( itk::EndEvent( ) );
188 }
189
190 // -------------------------------------------------------------------------
191 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
192 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
193 _BeforeGenerateData( )
194 {
195 }
196
197 // -------------------------------------------------------------------------
198 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
199 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
200 _AfterGenerateData( )
201 {
202 }
203
204 // -------------------------------------------------------------------------
205 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
206 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
207 _QueueInit( )
208 {
209   this->_QueueClear( );
210 }
211
212 #endif // __fpa__Base__Algorithm__hxx__
213
214 // eof - $RCSfile$