]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Base/MinimumSpanningTree.h
...
[FrontAlgorithms.git] / lib / fpa / Base / MinimumSpanningTree.h
1 #ifndef __FPA__BASE__MINIMUMSPANNINGTREE__H__
2 #define __FPA__BASE__MINIMUMSPANNINGTREE__H__
3
4 #include <map>
5 #include <utility>
6 #include <vector>
7 #include <itkSimpleDataObjectDecorator.h>
8 #include <itkSmartPointer.h>
9
10 namespace fpa
11 {
12   namespace Base
13   {
14     /**
15      */
16     template< class V, class B >
17     class MinimumSpanningTree
18       : public itk::SimpleDataObjectDecorator< std::map< V, std::pair< V, short >, B > >
19     {
20     public:
21       typedef std::pair< V, short >                        TNodeInfo;
22       typedef std::map< V, TNodeInfo, B >                  TDecorated;
23       typedef MinimumSpanningTree                          Self;
24       typedef itk::SimpleDataObjectDecorator< TDecorated > Superclass;
25       typedef itk::SmartPointer< Self >                    Pointer;
26       typedef itk::SmartPointer< const Self >              ConstPointer;
27
28       typedef V TVertex;
29       typedef B TVertexCompare;
30
31       typedef std::vector< TVertex >        TVertices;
32       typedef std::pair< TVertex, bool >    TCollision;
33       typedef std::vector< TCollision >     TCollisionsRow;
34       typedef std::vector< TCollisionsRow > TCollisions;
35
36     protected:
37       typedef std::vector< unsigned long > _TRow;
38       typedef std::vector< _TRow >         _TMatrix;
39
40     public:
41       itkNewMacro( Self );
42       itkTypeMacro( MinimumSpanningTree, itkSimpleDataObjectDecorator );
43
44       itkGetConstMacro( Collisions, TCollisions );
45
46     public:
47       void SetCollisions( const TCollisions& collisions );
48       void SetParent( const TVertex& v, const TVertex& p, const short& fid )
49         {
50           this->Get( )[ v ] = TNodeInfo( p, fid );
51           this->Modified( );
52         }
53       void Clear( )
54         {
55           this->Get( ).clear( );
56           this->m_Collisions.clear( );
57           this->m_FrontPaths.clear( );
58         }
59       virtual std::vector< V > GetPath( const V& a, const V& b ) const;
60
61       template< class I >
62       std::vector< typename I::PointType > GetPathFromImage(
63         const V& a, const V& b,
64         const I* image, unsigned int kernel = 0
65         ) const;
66
67     protected:
68       MinimumSpanningTree( );
69       virtual ~MinimumSpanningTree( );
70
71       virtual void _Path( std::vector< V >& path, const V& a ) const;
72
73     private:
74       // Purposely not implemented
75       MinimumSpanningTree( const Self& other );
76       Self& operator=( const Self& other );
77
78     protected:
79       TCollisions m_Collisions;
80       _TMatrix    m_FrontPaths;
81       static const unsigned long INF_VALUE;
82     };
83
84   } // ecapseman
85
86 } // ecapseman
87
88 #include <fpa/Base/MinimumSpanningTree.hxx>
89
90 #endif // __FPA__BASE__MINIMUMSPANNINGTREE__H__
91
92 // eof - $RCSfile$