18 #ifndef __otbRationalTransform_h
19 #define __otbRationalTransform_h
45 template <
class TScalarType = double,
46 unsigned int Dimension = 2>
73 itkStaticConstMacro(SpaceDimension,
unsigned int, Dimension);
76 void SetNumeratorDegree(
unsigned int value)
78 this->m_NumeratorDegree = value;
79 this->InitalizeParameters();
83 itkGetConstMacro(NumeratorDegree,
unsigned int);
86 void SetDenominatorDegree(
unsigned int value)
88 this->m_DenominatorDegree = value;
89 this->InitalizeParameters();
93 itkGetConstMacro(DenominatorDegree,
unsigned int);
99 if(this->GetNumberOfParameters() != this->m_Parameters.size())
102 itkExceptionMacro(<<
"Wrong number of parameters: found "<<this->m_Parameters.Size()<<
", expected "<<this->GetNumberOfParameters());
109 unsigned int dimensionStride = (m_DenominatorDegree+1)+(m_NumeratorDegree+1);
112 for(
unsigned int dim = 0; dim < SpaceDimension; ++dim)
115 TScalarType num = itk::NumericTraits<TScalarType>::Zero;
116 TScalarType denom = itk::NumericTraits<TScalarType>::Zero;
117 TScalarType currentPower = 1.;
120 for(
unsigned int numDegree = 0; numDegree <= m_NumeratorDegree; ++numDegree)
122 num+=this->m_Parameters[dim*dimensionStride+numDegree]*currentPower;
123 currentPower*=inputPoint[dim];
128 for(
unsigned int denomDegree = 0; denomDegree <= m_DenominatorDegree; ++denomDegree)
130 denom+=this->m_Parameters[dim*dimensionStride+m_NumeratorDegree+denomDegree+1]*currentPower;
131 currentPower*=inputPoint[dim];
135 outputPoint[dim]=num/denom;
143 virtual unsigned int GetNumberOfParameters()
const
145 return (m_NumeratorDegree +1 + m_DenominatorDegree+1)*SpaceDimension;
152 if(params.Size() != this->GetNumberOfParameters())
154 itkExceptionMacro(<<
"Wrong number of parameters: found "<<params.Size()<<
", expected "<<this->GetNumberOfParameters());
158 this->m_Parameters = params;
162 void InitalizeParameters()
164 this->m_Parameters.SetSize(this->GetNumberOfParameters());
165 this->m_Parameters.
Fill(0);
166 unsigned int dimensionStride = (m_DenominatorDegree+1)+(m_NumeratorDegree+1);
168 for(
unsigned int dim = 0; dim < SpaceDimension; ++dim)
170 this->m_Parameters[ dimensionStride *dim + m_NumeratorDegree+1] = 1.;
178 this->InitalizeParameters();
186 Superclass::PrintSelf(os, indent);
187 os << indent <<
"Numerator Degree : " << m_NumeratorDegree << std::endl;
188 os << indent <<
"Denominator Degree : " << m_DenominatorDegree << std::endl;
194 void operator =(
const Self&);