#define __FPA__BASE__REGIONGROW__H__
#include <queue>
+#include <utility>
#include <fpa/Base/Algorithm.h>
+#include <fpa/Base/Functors/TautologyFunction.h>
namespace fpa
{
/**
* Region grow is a front propagation with no costs.
*
- * @param V Vertex type.
- * @param C Vertex value type.
- * @param R Result value type.
- * @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 B Base class for this algorithm. It should be any itk-based
+ * filter (itk::ProcessObject).
*
*/
- template< class V, class C, class R, class B >
+ template< class V, class C, class R, class S, class VC, class B >
class RegionGrow
- : public Algorithm< V, C, R, B >
+ : public Algorithm< V, C, R, S, VC, B >
{
public:
typedef RegionGrow Self;
- typedef Algorithm< V, C, R, B > Superclass;
+ typedef Algorithm< V, C, R, S, VC, B > Superclass;
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::TVertex TVertex;
+ typedef typename Superclass::TValue TValue;
+ typedef typename Superclass::TResult TResult;
+ typedef typename Superclass::TSpace TSpace;
+ typedef typename Superclass::TVertexCompare TVertexCompare;
+
+ typedef fpa::Base::Functors::TautologyFunction< S, V > TGrowingFunction;
protected:
typedef typename Superclass::_TVertices _TVertices;
typedef typename Superclass::_TNode _TNode;
typedef typename Superclass::_TNodes _TNodes;
- typedef std::queue< _TNode > _TQueue;
+ typedef std::queue< std::pair< TVertex, _TNode > > _TQueue;
public:
itkTypeMacro( RegionGrow, Algorithm );
itkGetConstMacro( InsideValue, TResult );
itkGetConstMacro( OutsideValue, TResult );
+ itkGetObjectMacro( GrowingFunction, TGrowingFunction );
+ itkGetConstObjectMacro( GrowingFunction, TGrowingFunction );
itkSetMacro( InsideValue, TResult );
itkSetMacro( OutsideValue, TResult );
+ itkSetObjectMacro( GrowingFunction, TGrowingFunction );
protected:
RegionGrow( );
virtual ~RegionGrow( );
- virtual bool _CheckMembership( const TVertex& v ) const = 0;
+ virtual bool _CheckMembership( const TVertex& v ) const;
// Results-related abstract methods
virtual bool _ComputeNeighborResult(
// Queue-related abstract methods
virtual bool _IsQueueEmpty( ) const;
- virtual void _QueuePush( const _TNode& n );
- virtual _TNode _QueuePop( );
+ virtual void _QueuePush( const TVertex& v, const _TNode& n );
+ virtual void _QueuePop( TVertex& v, _TNode& n );
virtual void _QueueClear( );
private:
TResult m_InsideValue;
TResult m_OutsideValue;
_TQueue m_Queue;
+
+ typename TGrowingFunction::Pointer m_GrowingFunction;
};
} // ecapseman