]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Base/RegionGrow.h
First commit
[FrontAlgorithms.git] / lib / fpa / Base / RegionGrow.h
1 #ifndef __FPA__BASE__REGIONGROW__H__
2 #define __FPA__BASE__REGIONGROW__H__
3
4 #include <queue>
5 #include <vector>
6 #include <fpa/Base/Algorithm.h>
7
8 namespace fpa
9 {
10   namespace Base
11   {
12     /**
13      */
14     template< class V, class R, class VV, class VC >
15     class RegionGrowTraits
16     {
17     public:
18       typedef R  TResult;
19       typedef V  TVertex;
20       typedef VV TVertexValue;
21       typedef VC TVertexCmp;
22
23       typedef bool TCost;
24       typedef long TFrontId;
25
26       class TNode
27       {
28       public:
29         TNode( )
30           { }
31         TNode( const TVertex& v, const TFrontId& f )
32           : Vertex( v ),
33             Parent( v ),
34             FrontId( f )
35           { }
36         TNode( const TVertex& v, const TResult& r, const TFrontId& f )
37           : Vertex( v ),
38             Parent( v ),
39             Result( r ),
40             FrontId( f )
41           { }
42         virtual ~TNode( )
43           { }
44
45         TVertex Vertex;
46         TVertex Parent;
47         TResult Result;
48         TFrontId FrontId;
49       };
50
51       typedef std::vector< TNode > TNodes;
52     };
53
54     /**
55      * Region grow is a front propagation with no costs.
56      */
57     template< class V, class R, class VV, class VC, class B >
58     class RegionGrow
59       : public Algorithm< RegionGrowTraits< V, R, VV, VC >, B >
60     {
61     public:
62       typedef V  TVertex;
63       typedef R  TResult;
64       typedef VV TVertexValue;
65       typedef B  TBaseFilter;
66
67       /// Standard class typdedefs
68       typedef RegionGrowTraits< V, R, VV, VC > TTraits;
69       typedef RegionGrow                       Self;
70       typedef Algorithm< TTraits, B >          Superclass;
71       typedef itk::SmartPointer< Self >        Pointer;
72       typedef itk::SmartPointer< const Self >  ConstPointer;
73
74       typedef typename TTraits::TCost TCost;
75
76     protected:
77       typedef typename TTraits::TFrontId  _TFrontId;
78       typedef typename TTraits::TNode     _TNode;
79       typedef typename TTraits::TNodes    _TNodes;
80
81     private:
82       typedef std::queue< _TNode > _TQueue;
83
84     public:
85       itkTypeMacro( RegionGrow, Base );
86
87     protected:
88       RegionGrow( );
89       virtual ~RegionGrow( );
90
91       virtual   bool _UpdateResult    ( _TNode& n );
92       virtual   void _InitializeQueue ( );
93       virtual   bool _IsQueueEmpty    ( ) const;
94       virtual   void _QueuePush       ( const _TNode& n );
95       virtual _TNode _QueuePop        ( );
96       virtual   void _QueueClear      ( );
97       virtual   bool _UpdateNeigh     ( _TNode& nn, const _TNode& n );
98
99       virtual bool _CheckMembership( const _TNode& n ) const = 0;
100
101     private:
102       RegionGrow( const Self& );     // Not impl.
103       void operator=( const Self& ); // Not impl.
104
105     private:
106       _TQueue m_Queue;
107     };
108
109   } // ecapseman
110
111 } // ecapseman
112
113 #include <fpa/Base/RegionGrow.hxx>
114
115 #endif // __FPA__BASE__REGIONGROW__H__
116
117 // eof - $RCSfile$