X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FBase%2FDijkstra.h;h=d231c7c41da897886b69c63d97f0fca117908646;hb=60785c9e18cab1a338f1ce54551e97a5ddfabac1;hp=d4f27cdf7dce2c8065997323fb2f394a4c8adb64;hpb=56b8bb48cc05a297a3faa264f8f2a88de21ef203;p=FrontAlgorithms.git diff --git a/lib/fpa/Base/Dijkstra.h b/lib/fpa/Base/Dijkstra.h index d4f27cd..d231c7c 100644 --- a/lib/fpa/Base/Dijkstra.h +++ b/lib/fpa/Base/Dijkstra.h @@ -1,10 +1,14 @@ -#ifndef __FPA__BASE__DIJKSTRA__H__ -#define __FPA__BASE__DIJKSTRA__H__ +// ========================================================================= +// @author Leonardo Florez Valencia +// @email florez-l@javeriana.edu.co +// ========================================================================= + +#ifndef __fpa__Base__Dijkstra__h__ +#define __fpa__Base__Dijkstra__h__ -#include #include -#include #include +#include namespace fpa { @@ -12,80 +16,76 @@ namespace fpa { /** */ - template< class _TSuperclass > + template< class _TFilter, class _TMarksInterface, class _TSeedsInterface, class _TMST > class Dijkstra - : public _TSuperclass + : public _TFilter, + public _TMarksInterface, + public _TSeedsInterface { public: typedef Dijkstra Self; - typedef _TSuperclass Superclass; + typedef _TFilter Superclass; + typedef _TMarksInterface TMarksInterface; + typedef _TSeedsInterface TSeedsInterface; + typedef _TMST TMST; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; - // Template arguments - typedef typename Superclass::TVertex TVertex; - typedef typename Superclass::TScalar TScalar; - typedef typename Superclass::TFilter TFilter; - typedef typename Superclass::TVertexCompare TVertexCompare; - typedef typename Superclass::TFrontId TFrontId; - typedef typename Superclass::TCollision TCollision; - typedef typename Superclass::TCollisionsRow TCollisionsRow; - typedef typename Superclass::TCollisions TCollisions; - typedef typename Superclass::TNodeLabel TNodeLabel; - typedef typename Superclass::TNode TNode; - typedef typename Superclass::TNodes TNodes; - typedef typename Superclass::TVertices TVertices; - - typedef itk::FunctionBase< TScalar, TScalar > TCostConversionFunction; - - typedef - fpa::Base::MinimumSpanningTree< TVertex, TScalar, TVertexCompare > - TMinimumSpanningTree; - - struct TDijkstraCmp + typedef typename Superclass::TInputValue TInputValue; + typedef typename Superclass::TOutputValue TOutputValue; + typedef typename Superclass::TVertex TVertex; + typedef typename Superclass::TVertices TVertices; + + typedef itk::FunctionBase< TInputValue, TOutputValue > TIntensityFunctor; + typedef fpa::Base::Functors::VertexParentBase< TVertex, TOutputValue > TVertexFunctor; + + protected: + struct _TNode { - bool operator()( const TNode& a, const TNode& b ) - { return( b.Result < a.Result ); } + TVertex Vertex; + TVertex Parent; + TOutputValue Cost; + unsigned long FrontId; + _TNode( const TVertex& v, const TVertex& p, const unsigned long& fId ) + { + this->Vertex = v; + this->Parent = p; + this->FrontId = fId; + this->Cost = TOutputValue( 0 ); + } + bool operator<( const _TNode& b ) const + { + return( b.Cost < this->Cost ); + } }; - static const TDijkstraCmp DijkstraCmp; public: - itkTypeMacro( Dijkstra, Algorithm ); - - itkGetObjectMacro( CostConversionFunction, TCostConversionFunction ); - itkSetObjectMacro( CostConversionFunction, TCostConversionFunction ); + itkTypeMacro( Dijkstra, TFilter ); public: - TMinimumSpanningTree* GetMinimumSpanningTree( ); - const TMinimumSpanningTree* GetMinimumSpanningTree( ) const; - void GraftMinimumSpanningTree( itk::DataObject* obj ); + TMST* GetMinimumSpanningTree( ); + const TMST* GetMinimumSpanningTree( ) const; + + const TIntensityFunctor* GetIntensityFunctor( ) const; + const TVertexFunctor* GetVertexFunctor( ) const; + + void SetFunctor( TIntensityFunctor* functor ); + void SetFunctor( TVertexFunctor* functor ); protected: - // Methods to extend itk-based architecture Dijkstra( ); virtual ~Dijkstra( ); - // Front propagation methods to be overloaded - virtual void _AfterGenerateData( ) fpa_OVERRIDE; - virtual void _Visit( const TNode& n ) fpa_OVERRIDE; - virtual bool _Result( TNode& node, const TNode& parent ) fpa_OVERRIDE; - virtual void _QueueClear( ) fpa_OVERRIDE; - virtual void _QueuePush( const TNode& node ) fpa_OVERRIDE; - virtual TNode _QueuePop( ) fpa_OVERRIDE; - virtual bool _IsQueueEmpty( ) const fpa_OVERRIDE; - - // Dijkstra methods to be overloaded - virtual TScalar _Cost( const TVertex& a, const TVertex& b ) const = 0; + virtual void GenerateData( ) override; private: - // Purposely not implemented Dijkstra( const Self& other ); Self& operator=( const Self& other ); protected: - unsigned int m_MSTIdx; - std::vector< TNode > m_Queue; - typename TCostConversionFunction::Pointer m_CostConversionFunction; + typename TIntensityFunctor::Pointer m_IntensityFunctor; + typename TVertexFunctor::Pointer m_VertexFunctor; + unsigned long m_MSTIndex; }; } // ecapseman @@ -94,8 +94,8 @@ namespace fpa #ifndef ITK_MANUAL_INSTANTIATION # include -#endif +#endif // ITK_MANUAL_INSTANTIATION -#endif // __FPA__BASE__DIJKSTRA__H__ +#endif // __fpa__Base__Dijkstra__h__ // eof - $RCSfile$