X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FBase%2FDijkstra.h;h=115447be0e37bc2809091ac405a45d032088fc74;hb=4dc9dddd928daeb91104d5c18fa73a02975cedeb;hp=69fe86a798289509fb31557b6927c90dbbd64466;hpb=015105c2f44abb80923a59adfb1a01713506744f;p=FrontAlgorithms.git diff --git a/lib/fpa/Base/Dijkstra.h b/lib/fpa/Base/Dijkstra.h index 69fe86a..115447b 100644 --- a/lib/fpa/Base/Dijkstra.h +++ b/lib/fpa/Base/Dijkstra.h @@ -3,6 +3,7 @@ #include #include +#include namespace fpa { @@ -11,16 +12,17 @@ namespace fpa /** * Dijkstra is a front propagation algorithm that minimizes costs * - * @param V Vertex type. - * @param C Vertex value type. - * @param R Result value type. - * @param S Space type where vertices are. - * @param VC Vertex lexicographical compare. - * @param B Base class for this algorithm. It should be any itk-based - * filter (itk::ProcessObject). + * @param V Vertex type. + * @param C Vertex value type. + * @param R Result value type. + * @param S Space type where vertices are. + * @param VC Vertex lexicographical compare. + * @param MST Minimum spanning tree type. + * @param B Base class for this algorithm. It should be any itk-based + * filter (itk::ProcessObject). * */ - template< class V, class C, class R, class S, class VC, class B > + template< class V, class C, class R, class S, class VC, class MST, class B > class Dijkstra : public Algorithm< V, C, R, S, VC, B > { @@ -30,12 +32,12 @@ namespace fpa typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; - typedef typename Superclass::TVertex TVertex; - typedef typename Superclass::TValue TValue; - typedef typename Superclass::TResult TResult; - typedef typename Superclass::TSpace TSpace; - typedef typename Superclass::TVertexCompare TVertexCompare; - typedef typename Superclass::TMinimumSpanningTree TMinimumSpanningTree; + typedef MST TMinimumSpanningTree; + typedef typename Superclass::TVertex TVertex; + typedef typename Superclass::TValue TValue; + typedef typename Superclass::TResult TResult; + typedef typename Superclass::TSpace TSpace; + typedef typename Superclass::TVertexCompare TVertexCompare; typedef typename Superclass::TStartEvent TStartEvent; typedef typename Superclass::TStartLoopEvent TStartLoopEvent; @@ -72,8 +74,16 @@ namespace fpa itkTypeMacro( Dijkstra, Algorithm ); itkBooleanMacro( LocalCosts ); + itkBooleanMacro( FillNodeQueue ); itkGetConstMacro( LocalCosts, bool ); + itkGetConstMacro( FillNodeQueue, bool ); itkSetMacro( LocalCosts, bool ); + itkSetMacro( FillNodeQueue, bool ); + + public: + TMinimumSpanningTree* GetMinimumSpanningTree( ); + const TMinimumSpanningTree* GetMinimumSpanningTree( ) const; + void GraftMinimumSpanningTree( itk::DataObject* obj ); protected: Dijkstra( ); @@ -81,16 +91,19 @@ namespace fpa virtual TResult _Cost( const TVertex& v, const TVertex& p ) const = 0; + virtual void _BeforeGenerateData( ) ITK_OVERRIDE; + // Results-related abstract methods virtual bool _ComputeNeighborResult( TResult& result, const TVertex& neighbor, const TVertex& parent - ) const; + ) const ITK_OVERRIDE; + virtual void _SetResult( const TVertex& v, const _TNode& n ) ITK_OVERRIDE; // Queue-related abstract methods - virtual bool _IsQueueEmpty( ) const; - virtual void _QueuePush( const TVertex& v, const _TNode& n ); - virtual void _QueuePop( TVertex& v, _TNode& n ); - virtual void _QueueClear( ); + virtual bool _IsQueueEmpty( ) const ITK_OVERRIDE; + virtual void _QueuePush( const TVertex& v, const _TNode& n ) ITK_OVERRIDE; + virtual void _QueuePop( TVertex& v, _TNode& n ) ITK_OVERRIDE; + virtual void _QueueClear( ) ITK_OVERRIDE; private: // Purposely not implemented @@ -99,14 +112,18 @@ namespace fpa protected: bool m_LocalCosts; + bool m_FillNodeQueue; _TQueue m_Queue; + unsigned int m_MSTIdx; }; } // ecapseman } // ecapseman +#ifndef ITK_MANUAL_INSTANTIATION #include +#endif // ITK_MANUAL_INSTANTIATION #endif // __FPA__BASE__DIJKSTRA__H__