X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FBase%2FDijkstra.hxx;h=be3598173de4c74d81334389ec930ff4b637b120;hb=479d85a44365c8aa01976ffb9c7d67d3e9e52b63;hp=25d56504051fbb1b2b1bccd01a9a239487764051;hpb=015105c2f44abb80923a59adfb1a01713506744f;p=FrontAlgorithms.git diff --git a/lib/fpa/Base/Dijkstra.hxx b/lib/fpa/Base/Dijkstra.hxx index 25d5650..be35981 100644 --- a/lib/fpa/Base/Dijkstra.hxx +++ b/lib/fpa/Base/Dijkstra.hxx @@ -1,86 +1,85 @@ -#ifndef __FPA__BASE__DIJKSTRA__HXX__ -#define __FPA__BASE__DIJKSTRA__HXX__ +// ========================================================================= +// @author Leonardo Florez Valencia +// @email florez-l@javeriana.edu.co +// ========================================================================= -#include +#ifndef __fpa__Base__Dijkstra__hxx__ +#define __fpa__Base__Dijkstra__hxx__ // ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -fpa::Base::Dijkstra< V, C, R, S, VC, B >:: -Dijkstra( ) - : Superclass( ), - m_LocalCosts( false ) +template< class _TAlgorithm, class _TMST > +typename fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +TMST* fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +GetMinimumSpanningTree( ) { + return( + dynamic_cast< TMST* >( + this->itk::ProcessObject::GetOutput( this->m_MSTIdx ) + ) + ); } // ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -fpa::Base::Dijkstra< V, C, R, S, VC, B >:: -~Dijkstra( ) +template< class _TAlgorithm, class _TMST > +const typename fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +TMST* fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +GetMinimumSpanningTree( ) const { + return( + dynamic_cast< const TMST* >( + this->itk::ProcessObject::GetOutput( this->m_MSTIdx ) + ) + ); } // ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -bool fpa::Base::Dijkstra< V, C, R, S, VC, B >:: -_ComputeNeighborResult( - TResult& result, const TVertex& neighbor, const TVertex& parent - ) const +template< class _TAlgorithm, class _TMST > +fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +Dijkstra( ) + : Superclass( ) { - result = this->_Cost( neighbor, parent ); - result *= TResult( this->_Distance( neighbor, parent ) ); - - // WARNING: Dijkstra does not work on negative values! - if( result >= TResult( 0 ) ) - { - _TNode pn = this->_Node( parent ); - if( pn.Label == Self::AliveLabel && !this->m_LocalCosts ) - result += pn.Result; - return( true ); - } - else - return( false ); + this->m_MSTIdx = this->GetNumberOfRequiredOutputs( ); + this->itk::ProcessObject::SetNumberOfRequiredOutputs( this->m_MSTIdx + 1 ); + this->SetNthOutput( this->m_MSTIdx, TMST::New( ) ); } // ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -bool fpa::Base::Dijkstra< V, C, R, S, VC, B >:: -_IsQueueEmpty( ) const +template< class _TAlgorithm, class _TMST > +fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +~Dijkstra( ) { - 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 >:: -_QueuePush( const TVertex& v, const _TNode& n ) +template< class _TAlgorithm, class _TMST > +void fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +_AfterGenerateData( ) { - _TQueueNode qn; - qn.Vertex = v; - qn.Node = n; - this->m_Queue.push_back( qn ); - std::push_heap( this->m_Queue.begin( ), this->m_Queue.end( ) ); -} + this->Superclass::_AfterGenerateData( ); -// ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -void fpa::Base::Dijkstra< V, C, R, S, VC, B >:: -_QueuePop( TVertex& v, _TNode& n ) -{ - _TQueueNode qn = this->m_Queue.front( ); - std::pop_heap( this->m_Queue.begin( ), this->m_Queue.end( ) ); - this->m_Queue.pop_back( ); - v = qn.Vertex; - n = qn.Node; + TMST* mst = this->GetMinimumSpanningTree( ); + mst->ClearSeeds( ); + mst->SetCollisions( this->m_Collisions ); + + TSeeds seeds = this->GetSeeds( ); + typename TSeeds::const_iterator sIt = seeds.begin( ); + for( ; sIt != seeds.end( ); ++sIt ) + { + if( sIt->IsUnified ) + mst->AddSeed( sIt->Vertex ); + + } // rof } // ------------------------------------------------------------------------- -template< class V, class C, class R, class S, class VC, class B > -void fpa::Base::Dijkstra< V, C, R, S, VC, B >:: -_QueueClear( ) +template< class _TAlgorithm, class _TMST > +void fpa::Base::Dijkstra< _TAlgorithm, _TMST >:: +_UpdateOutputValue( const TNode& n ) { - this->m_Queue.clear( ); + this->Superclass::_UpdateOutputValue( n ); + this->GetMinimumSpanningTree( )->SetParent( n.Vertex, n.Parent ); } -#endif // __FPA__BASE__DIJKSTRA__HXX__ +#endif // __fpa__Base__Dijkstra__hxx__ // eof - $RCSfile$