X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FBase%2FDijkstra.hxx;h=bad348b1156ac276f388bfbfb367dec486f0b91a;hb=4dc9dddd928daeb91104d5c18fa73a02975cedeb;hp=25d56504051fbb1b2b1bccd01a9a239487764051;hpb=015105c2f44abb80923a59adfb1a01713506744f;p=FrontAlgorithms.git diff --git a/lib/fpa/Base/Dijkstra.hxx b/lib/fpa/Base/Dijkstra.hxx index 25d5650..bad348b 100644 --- a/lib/fpa/Base/Dijkstra.hxx +++ b/lib/fpa/Base/Dijkstra.hxx @@ -4,24 +4,75 @@ #include // ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -fpa::Base::Dijkstra< V, C, R, S, VC, B >:: +template< class V, class C, class R, class S, class VC, class MST, class B > +typename fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: +TMinimumSpanningTree* fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: +GetMinimumSpanningTree( ) +{ + return( + dynamic_cast< TMinimumSpanningTree* >( + this->itk::ProcessObject::GetOutput( this->m_MSTIdx ) + ) + ); +} + +// ------------------------------------------------------------------------- +template< class V, class C, class R, class S, class VC, class MST, class B > +const typename fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: +TMinimumSpanningTree* fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: +GetMinimumSpanningTree( ) const +{ + return( + dynamic_cast< const TMinimumSpanningTree* >( + this->itk::ProcessObject::GetOutput( this->m_MSTIdx ) + ) + ); +} + +// ------------------------------------------------------------------------- +template< class V, class C, class R, class S, class VC, class MST, class B > +void fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: +GraftMinimumSpanningTree( itk::DataObject* obj ) +{ + TMinimumSpanningTree* mst = dynamic_cast< TMinimumSpanningTree* >( obj ); + if( mst != NULL ) + this->GraftNthOutput( this->m_MSTIdx, mst ); +} + +// ------------------------------------------------------------------------- +template< class V, class C, class R, class S, class VC, class MST, class B > +fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: Dijkstra( ) : Superclass( ), - m_LocalCosts( false ) + m_LocalCosts( false ), + m_FillNodeQueue( false ) { + this->m_MSTIdx = this->GetNumberOfRequiredOutputs( ); + this->SetNumberOfRequiredOutputs( this->m_MSTIdx + 1 ); + this->itk::ProcessObject::SetNthOutput( + this->m_MSTIdx, TMinimumSpanningTree::New( ) + ); } // ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -fpa::Base::Dijkstra< V, C, R, S, VC, B >:: +template< class V, class C, class R, class S, class VC, class MST, class B > +fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: ~Dijkstra( ) { } // ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -bool fpa::Base::Dijkstra< V, C, R, S, VC, B >:: +template< class V, class C, class R, class S, class VC, class MST, class B > +void fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: +_BeforeGenerateData( ) +{ + this->Superclass::_BeforeGenerateData( ); + this->GetMinimumSpanningTree( )->SetFillNodeQueue( this->m_FillNodeQueue ); +} + +// ------------------------------------------------------------------------- +template< class V, class C, class R, class S, class VC, class MST, class B > +bool fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: _ComputeNeighborResult( TResult& result, const TVertex& neighbor, const TVertex& parent ) const @@ -42,16 +93,24 @@ _ComputeNeighborResult( } // ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -bool fpa::Base::Dijkstra< V, C, R, S, VC, B >:: +template< class V, class C, class R, class S, class VC, class MST, class B > +void fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: +_SetResult( const TVertex& v, const _TNode& n ) +{ + this->GetMinimumSpanningTree( )->SetNode( v, n.Parent, n.FrontId, n.Result ); +} + +// ------------------------------------------------------------------------- +template< class V, class C, class R, class S, class VC, class MST, class B > +bool fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: _IsQueueEmpty( ) const { return( this->m_Queue.empty( ) ); } // ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -void fpa::Base::Dijkstra< V, C, R, S, VC, B >:: +template< class V, class C, class R, class S, class VC, class MST, class B > +void fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: _QueuePush( const TVertex& v, const _TNode& n ) { _TQueueNode qn; @@ -62,8 +121,8 @@ _QueuePush( const TVertex& v, const _TNode& n ) } // ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -void fpa::Base::Dijkstra< V, C, R, S, VC, B >:: +template< class V, class C, class R, class S, class VC, class MST, class B > +void fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: _QueuePop( TVertex& v, _TNode& n ) { _TQueueNode qn = this->m_Queue.front( ); @@ -74,8 +133,8 @@ _QueuePop( TVertex& v, _TNode& n ) } // ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -void fpa::Base::Dijkstra< V, C, R, S, VC, B >:: +template< class V, class C, class R, class S, class VC, class MST, class B > +void fpa::Base::Dijkstra< V, C, R, S, VC, MST, B >:: _QueueClear( ) { this->m_Queue.clear( );