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