00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef _itkChainCodePath2D_h
00019 #define _itkChainCodePath2D_h
00020
00021 #include "itkChainCodePath.h"
00022 #include "itkObjectFactory.h"
00023 #include "itkIndex.h"
00024 #include "itkOffset.h"
00025 #include <vector>
00026 #include <string>
00027
00028
00029 namespace itk
00030 {
00031
00032
00050 class ITKCommon_EXPORT ChainCodePath2D : public
00051 ChainCodePath<2>
00052 {
00053 public:
00055 itkStaticConstMacro(Dimension, unsigned int, 2);
00056
00058 typedef ChainCodePath2D Self;
00059 typedef ChainCodePath<2> Superclass;
00060
00061 typedef SmartPointer<Self> Pointer;
00062 typedef SmartPointer<const Self> ConstPointer;
00063
00065 itkTypeMacro(ChainCodePath2D, ChainCodePath);
00066
00067
00069 typedef Superclass::OutputType OutputType;
00070 typedef Superclass::InputType InputType;
00071
00073 typedef OutputType OffsetType;
00074 typedef Index<2> IndexType;
00075
00077 typedef std::vector<OffsetType> ChainCodeType;
00079 typedef std::vector<int> ChainCode2DType;
00080
00081
00082
00083
00084
00086 virtual OutputType Evaluate( const InputType & input ) const;
00087
00089 virtual IndexType EvaluateToIndex( const InputType & input ) const;
00090
00095 virtual OffsetType IncrementInput(InputType & input) const;
00096
00097
00098
00099
00100
00102 itkNewMacro( Self );
00103
00105 inline unsigned int NumberOfSteps() const { return m_Chain2D.size(); }
00106
00107
00109 inline void InsertStep( InputType position, int encodedStep )
00110 {
00111 m_Chain2D.insert( m_Chain2D.begin()+position, encodedStep );
00112 this->Modified();
00113 }
00114 inline void InsertStep( InputType position, OffsetType step )
00115 {
00116 m_Chain2D.insert( m_Chain2D.begin()+position, EncodeOffset(step) );
00117 this->Modified();
00118 }
00119
00120
00122 inline void ChangeStep( InputType position, int encodedStep )
00123 {
00124 m_Chain2D[position]=encodedStep;
00125 this->Modified();
00126 }
00127 inline void ChangeStep( InputType position, OffsetType step )
00128 {
00129 m_Chain2D[position]=EncodeOffset(step);
00130 this->Modified();
00131 }
00132
00134 virtual inline void Clear()
00135 {
00136 m_Chain2D.clear();
00137 this->Modified();
00138 }
00139
00140 std::string GetChainCodeAsString(void) const;
00141
00142
00143
00144 protected:
00145 ChainCodePath2D();
00146 ~ChainCodePath2D();
00147 void PrintSelf(std::ostream& os, Indent indent) const;
00148
00150 inline int EncodeOffset( OffsetType step ) const
00151 {
00152 return m_FreemanCode[ step[0] + 1 ][ step[1] + 1 ];
00153 }
00154 inline OffsetType DecodeOffset( int encodedStep ) const
00155 {
00156 return m_ReverseFreemanCode[ encodedStep ];
00157 }
00158
00159
00160
00161 private:
00162 ChainCodePath2D(const Self&);
00163 void operator=(const Self&);
00164
00165 ChainCode2DType m_Chain2D;
00166
00167
00168
00169
00170
00171
00172
00173
00174 int m_FreemanCode[3][3];
00175
00176
00177
00178 OffsetType m_ReverseFreemanCode[9];
00179 };
00180
00181 }
00182
00183 #endif