X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FFilters%2FDijkstraBase.h;fp=lib%2Ffpa%2FFilters%2FDijkstraBase.h;h=da844eeb47197bf0ba00b5536cc5343a2047364a;hb=2047276c8f1a02432fbcc7014722d460d6c1e60f;hp=0000000000000000000000000000000000000000;hpb=3c639e5da479c7216a0a302ffa156ac6762caeed;p=FrontAlgorithms.git diff --git a/lib/fpa/Filters/DijkstraBase.h b/lib/fpa/Filters/DijkstraBase.h new file mode 100644 index 0000000..da844ee --- /dev/null +++ b/lib/fpa/Filters/DijkstraBase.h @@ -0,0 +1,97 @@ +// ========================================================================= +// @author Leonardo Florez Valencia +// @email florez-l@javeriana.edu.co +// ========================================================================= +#ifndef __fpa__Filters__DijkstraBase__h__ +#define __fpa__Filters__DijkstraBase__h__ + +#include +#include +#include +#include +#include + +namespace fpa +{ + namespace Filters + { + /** + */ + template< class _TTraits > + class DijkstraBase + : public fpa::Filters::Algorithm< _TTraits > + { + public: + typedef _TTraits TTraits; + fpaTraitsMacro( typename, TTraits ); + + typedef fpa::Filters::Algorithm< TTraits > Superclass; + typedef DijkstraBase Self; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef std::vector< TNode > TQueue; + struct TQueueOrder + { + bool operator()( const TNode& a, const TNode& b ) const + { + return( b.Value < a.Value ); + } + }; + + typedef itk::FunctionBase< TOutputValue, TOutputValue > TScalarWeight; + typedef fpa::Functors::BaseVertexFunction< TVertex, TOutputValue > TVertexWeight; + + protected: + itkConceptMacro( + Check_TOutputValue, + ( itk::Concept::IsFloatingPoint< TOutputValue > ) + ); + + public: + itkTypeMacro( fpa::Filters::DijkstraBase, fpa::Filters::Algorithm ); + + itkGetConstObjectMacro( ScalarWeight, TScalarWeight ); + itkGetObjectMacro( ScalarWeight, TScalarWeight ); + + itkGetConstObjectMacro( VertexWeight, TVertexWeight ); + itkGetObjectMacro( VertexWeight, TVertexWeight ); + + public: + void SetWeightFunction( TScalarWeight* w ); + void SetWeightFunction( TVertexWeight* w ); + + protected: + DijkstraBase( ); + virtual ~DijkstraBase( ); + + virtual void _UpdateOutputValue( TNode& n ) override; + virtual void _QueueClear( ) override; + virtual TNode _QueuePop( ) override; + virtual void _QueuePush( const TNode& n ) override; + virtual unsigned long _QueueSize( ) const override; + virtual void _ComputeOutputValue( TNode& n ) override; + + private: + // Purposely not implemented. + DijkstraBase( const Self& other ); + Self& operator=( const Self& other ); + + protected: + typename TScalarWeight::Pointer m_ScalarWeight; + typename TVertexWeight::Pointer m_VertexWeight; + + TQueue m_Queue; + TQueueOrder m_QueueOrder; + }; + + } // ecapseman + +} // ecapseman + +#ifndef ITK_MANUAL_INSTANTIATION +# include +#endif // ITK_MANUAL_INSTANTIATION + +#endif // __fpa__Filters__DijkstraBase__h__ +// eof - $RCSfile$