]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Base/Dijkstra.hxx
df9c75e5d07cbc994b5a4db3966bd879eabdfcc4
[FrontAlgorithms.git] / lib / fpa / Base / Dijkstra.hxx
1 #ifndef __fpa__Base__Dijkstra__hxx__
2 #define __fpa__Base__Dijkstra__hxx__
3
4 #include <algorithm>
5 #include <limits>
6
7 // -------------------------------------------------------------------------
8 template< class _TSuperclass, class _TMST >
9 _TMST* fpa::Base::Dijkstra< _TSuperclass, _TMST >::
10 GetMinimumSpanningTree( )
11 {
12   return(
13     dynamic_cast< _TMST* >(
14       this->itk::ProcessObject::GetOutput( this->m_MSTIndex )
15       )
16     );
17 }
18
19 // -------------------------------------------------------------------------
20 template< class _TSuperclass, class _TMST >
21 const _TMST* fpa::Base::Dijkstra< _TSuperclass, _TMST >::
22 GetMinimumSpanningTree( ) const
23 {
24   return(
25     dynamic_cast< const _TMST* >(
26       this->itk::ProcessObject::GetOutput( this->m_MSTIndex )
27       )
28     );
29 }
30
31 // -------------------------------------------------------------------------
32 template< class _TSuperclass, class _TMST >
33 fpa::Base::Dijkstra< _TSuperclass, _TMST >::
34 Dijkstra( )
35   : Superclass( )
36 {
37   this->m_InitResult = TOutput( 0 );
38   this->m_MSTIndex = this->GetNumberOfRequiredOutputs( );
39   this->SetNumberOfRequiredOutputs( this->m_MSTIndex + 1 );
40   this->itk::ProcessObject::SetNthOutput( this->m_MSTIndex, _TMST::New( ) );
41 }
42
43 // -------------------------------------------------------------------------
44 template< class _TSuperclass, class _TMST >
45 fpa::Base::Dijkstra< _TSuperclass, _TMST >::
46 ~Dijkstra( )
47 {
48 }
49
50 // -------------------------------------------------------------------------
51 template< class _TSuperclass, class _TMST >
52 void fpa::Base::Dijkstra< _TSuperclass, _TMST >::
53 _AfterGenerateData( )
54 {
55   this->Superclass::_AfterGenerateData( );
56
57   auto mst = this->GetMinimumSpanningTree( );
58   mst->ClearSeeds( );
59   for( auto s = this->m_Seeds.begin( ); s != this->m_Seeds.end( ); ++s )
60     mst->AddSeed( s->Vertex );
61   mst->SetCollisions( this->m_Collisions );
62 }
63
64 // -------------------------------------------------------------------------
65 template< class _TSuperclass, class _TMST >
66 void fpa::Base::Dijkstra< _TSuperclass, _TMST >::
67 _UpdateResult( const _TQueueNode& n )
68 {
69   this->Superclass::_UpdateResult( n );
70   this->GetMinimumSpanningTree( )->SetParent( n.Vertex, n.Parent );
71 }
72
73 // -------------------------------------------------------------------------
74 template< class _TSuperclass, class _TMST >
75 bool fpa::Base::Dijkstra< _TSuperclass, _TMST >::
76 _UpdateValue( _TQueueNode& v, const _TQueueNode& p )
77 {
78   v.Result = this->_GetInputValue( p.Vertex, v.Vertex );
79   if( v.Result >= TOutput( 0 ) )
80   {
81     v.Result += p.Result;
82     return( true );
83   }
84   else
85   {
86     v.Result = this->m_InitResult;
87     return( false );
88
89   } // fi
90 }
91
92 #endif // __fpa__Base__Dijkstra__hxx__
93
94 // eof - $RCSfile$