ITK
4.1.0
Insight Segmentation and Registration Toolkit
|
00001 /*========================================================================= 00002 * 00003 * Copyright Insight Software Consortium 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0.txt 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 * 00017 *=========================================================================*/ 00018 #ifndef __itkMatrixOffsetTransformBase_h 00019 #define __itkMatrixOffsetTransformBase_h 00020 00021 #include <iostream> 00022 00023 #include "itkMatrix.h" 00024 #include "itkTransform.h" 00025 #include "itkMacro.h" 00026 00027 namespace itk 00028 { 00070 template < 00071 class TScalarType = double, // Data type for scalars 00072 unsigned int NInputDimensions = 3, // Number of dimensions in the input space 00073 unsigned int NOutputDimensions = 3> 00074 // Number of dimensions in the output space 00075 class MatrixOffsetTransformBase : 00076 public Transform<TScalarType, NInputDimensions, NOutputDimensions> 00077 { 00078 public: 00080 typedef MatrixOffsetTransformBase Self; 00081 typedef Transform<TScalarType, 00082 NInputDimensions, 00083 NOutputDimensions> Superclass; 00084 00085 typedef SmartPointer<Self> Pointer; 00086 typedef SmartPointer<const Self> ConstPointer; 00087 00089 itkTypeMacro(MatrixOffsetTransformBase, Transform); 00090 00092 itkNewMacro(Self); 00093 00095 itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions); 00096 itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions); 00097 itkStaticConstMacro( ParametersDimension, unsigned int, 00098 NOutputDimensions * ( NInputDimensions + 1 ) ); 00100 00102 typedef typename Superclass::ParametersType ParametersType; 00103 typedef typename Superclass::ParametersValueType ParametersValueType; 00104 00106 typedef typename Superclass::JacobianType JacobianType; 00107 00109 typedef typename Superclass::ScalarType ScalarType; 00110 00112 typedef Vector<TScalarType, 00113 itkGetStaticConstMacro(InputSpaceDimension)> InputVectorType; 00114 typedef Vector<TScalarType, 00115 itkGetStaticConstMacro(OutputSpaceDimension)> OutputVectorType; 00116 typedef typename OutputVectorType::ValueType OutputVectorValueType; 00118 00120 typedef CovariantVector<TScalarType, 00121 itkGetStaticConstMacro(InputSpaceDimension)> 00122 InputCovariantVectorType; 00123 typedef CovariantVector<TScalarType, 00124 itkGetStaticConstMacro(OutputSpaceDimension)> 00125 OutputCovariantVectorType; 00127 00128 typedef typename Superclass::InputVectorPixelType InputVectorPixelType; 00129 typedef typename Superclass::OutputVectorPixelType OutputVectorPixelType; 00130 00132 typedef typename Superclass::InputDiffusionTensor3DType 00133 InputDiffusionTensor3DType; 00134 typedef typename Superclass::OutputDiffusionTensor3DType 00135 OutputDiffusionTensor3DType; 00136 00138 typedef typename Superclass::InputSymmetricSecondRankTensorType 00139 InputSymmetricSecondRankTensorType; 00140 typedef typename Superclass::OutputSymmetricSecondRankTensorType 00141 OutputSymmetricSecondRankTensorType; 00142 00143 typedef CovariantVector<TScalarType, InputDiffusionTensor3DType::Dimension> 00144 InputTensorEigenVectorType; 00145 00147 typedef vnl_vector_fixed<TScalarType, 00148 itkGetStaticConstMacro(InputSpaceDimension)> 00149 InputVnlVectorType; 00150 typedef vnl_vector_fixed<TScalarType, 00151 itkGetStaticConstMacro(OutputSpaceDimension)> 00152 OutputVnlVectorType; 00154 00156 typedef Point<TScalarType, 00157 itkGetStaticConstMacro(InputSpaceDimension)> 00158 InputPointType; 00159 typedef typename InputPointType::ValueType InputPointValueType; 00160 typedef Point<TScalarType, 00161 itkGetStaticConstMacro(OutputSpaceDimension)> 00162 OutputPointType; 00163 typedef typename OutputPointType::ValueType OutputPointValueType; 00165 00167 typedef Matrix<TScalarType, itkGetStaticConstMacro(OutputSpaceDimension), 00168 itkGetStaticConstMacro(InputSpaceDimension)> 00169 MatrixType; 00170 typedef typename MatrixType::ValueType MatrixValueType; 00172 00174 typedef Matrix<TScalarType, itkGetStaticConstMacro(InputSpaceDimension), 00175 itkGetStaticConstMacro(OutputSpaceDimension)> 00176 InverseMatrixType; 00177 00178 typedef InputPointType CenterType; 00179 00180 typedef OutputVectorType OffsetType; 00181 typedef typename OffsetType::ValueType OffsetValueType; 00182 00183 typedef OutputVectorType TranslationType; 00184 00185 typedef typename TranslationType::ValueType TranslationValueType; 00186 00189 typedef typename Superclass::InverseTransformBaseType InverseTransformBaseType; 00190 typedef typename InverseTransformBaseType::Pointer InverseTransformBasePointer; 00191 00195 virtual void SetIdentity(void); 00196 00208 virtual void SetMatrix(const MatrixType & matrix) 00209 { 00210 m_Matrix = matrix; this->ComputeOffset(); 00211 this->ComputeMatrixParameters(); 00212 m_MatrixMTime.Modified(); this->Modified(); return; 00213 } 00215 00223 virtual const MatrixType & GetMatrix() const 00224 { 00225 return m_Matrix; 00226 } 00227 00236 void SetOffset(const OutputVectorType & offset) 00237 { 00238 m_Offset = offset; this->ComputeTranslation(); 00239 this->Modified(); return; 00240 } 00242 00248 const OutputVectorType & GetOffset(void) const 00249 { 00250 return m_Offset; 00251 } 00252 00275 void SetCenter(const InputPointType & center) 00276 { 00277 m_Center = center; this->ComputeOffset(); 00278 this->Modified(); return; 00279 } 00281 00288 const InputPointType & GetCenter() const 00289 { 00290 return m_Center; 00291 } 00292 00299 void SetTranslation(const OutputVectorType & translation) 00300 { 00301 m_Translation = translation; this->ComputeOffset(); 00302 this->Modified(); return; 00303 } 00305 00312 const OutputVectorType & GetTranslation(void) const 00313 { 00314 return m_Translation; 00315 } 00316 00321 void SetParameters(const ParametersType & parameters); 00322 00324 const ParametersType & GetParameters(void) const; 00325 00327 virtual void SetFixedParameters(const ParametersType &); 00328 00330 virtual const ParametersType & GetFixedParameters(void) const; 00331 00343 void Compose(const Self *other, bool pre = 0); 00344 00353 OutputPointType TransformPoint(const InputPointType & point) const; 00354 00355 using Superclass::TransformVector; 00356 00357 OutputVectorType TransformVector(const InputVectorType & vector) const; 00358 00359 OutputVnlVectorType TransformVector(const InputVnlVectorType & vector) const; 00360 00361 OutputVectorPixelType TransformVector(const InputVectorPixelType & vector) const; 00362 00363 using Superclass::TransformCovariantVector; 00364 00365 OutputCovariantVectorType TransformCovariantVector(const InputCovariantVectorType & vector) const; 00366 00367 OutputVectorPixelType TransformCovariantVector(const InputVectorPixelType & vector) const; 00368 00369 using Superclass::TransformDiffusionTensor3D; 00370 00371 OutputDiffusionTensor3DType TransformDiffusionTensor3D(const InputDiffusionTensor3DType & tensor) const; 00372 00373 OutputVectorPixelType TransformDiffusionTensor3D(const InputVectorPixelType & tensor ) const; 00374 00375 using Superclass::TransformSymmetricSecondRankTensor; 00376 OutputSymmetricSecondRankTensorType TransformSymmetricSecondRankTensor( const InputSymmetricSecondRankTensorType & tensor ) const; 00377 00378 OutputVectorPixelType TransformSymmetricSecondRankTensor( const InputVectorPixelType & tensor ) const; 00379 00389 virtual void ComputeJacobianWithRespectToParameters(const InputPointType & x, JacobianType & j) const; 00390 00394 virtual void ComputeJacobianWithRespectToPosition(const InputPointType & x, JacobianType & jac) const; 00395 00399 virtual void ComputeInverseJacobianWithRespectToPosition(const InputPointType & x, JacobianType & jac) const; 00400 00419 bool GetInverse(Self *inverse) const; 00421 00423 virtual InverseTransformBasePointer GetInverseTransform() const; 00424 00428 const InverseMatrixType & GetInverseMatrix(void) const; 00429 00435 virtual bool IsLinear() const 00436 { 00437 return true; 00438 } 00439 protected: 00440 00448 MatrixOffsetTransformBase(const MatrixType & matrix, const OutputVectorType & offset); 00449 MatrixOffsetTransformBase(unsigned int paramDims); 00450 MatrixOffsetTransformBase(); 00452 00454 virtual ~MatrixOffsetTransformBase(); 00455 00457 void PrintSelf(std::ostream & s, Indent indent) const; 00458 00459 const InverseMatrixType & GetVarInverseMatrix(void) const 00460 { 00461 return m_InverseMatrix; 00462 } 00463 void SetVarInverseMatrix(const InverseMatrixType & matrix) const 00464 { 00465 m_InverseMatrix = matrix; m_InverseMatrixMTime.Modified(); 00466 } 00467 bool InverseMatrixIsOld(void) const 00468 { 00469 if( m_MatrixMTime != m_InverseMatrixMTime ) 00470 { 00471 return true; 00472 } 00473 else 00474 { 00475 return false; 00476 } 00477 } 00478 00479 virtual void ComputeMatrixParameters(void); 00480 00481 virtual void ComputeMatrix(void); 00482 00483 void SetVarMatrix(const MatrixType & matrix) 00484 { 00485 m_Matrix = matrix; m_MatrixMTime.Modified(); 00486 } 00487 00488 virtual void ComputeTranslation(void); 00489 00490 void SetVarTranslation(const OutputVectorType & translation) 00491 { 00492 m_Translation = translation; 00493 } 00494 00495 virtual void ComputeOffset(void); 00496 00497 void SetVarOffset(const OutputVectorType & offset) 00498 { 00499 m_Offset = offset; 00500 } 00501 00502 void SetVarCenter(const InputPointType & center) 00503 { 00504 m_Center = center; 00505 } 00506 private: 00507 00508 MatrixOffsetTransformBase(const Self & other); 00509 const Self & operator=(const Self &); 00510 00511 MatrixType m_Matrix; // Matrix of the transformation 00512 OutputVectorType m_Offset; // Offset of the transformation 00513 mutable InverseMatrixType m_InverseMatrix; // Inverse of the matrix 00514 mutable bool m_Singular; // Is m_Inverse singular? 00515 00516 InputPointType m_Center; 00517 OutputVectorType m_Translation; 00518 00520 TimeStamp m_MatrixMTime; 00521 mutable TimeStamp m_InverseMatrixMTime; 00522 }; // class MatrixOffsetTransformBase 00523 } // namespace itk 00524 00525 // Define instantiation macro for this template. 00526 #define ITK_TEMPLATE_MatrixOffsetTransformBase(_, EXPORT, TypeX, TypeY) \ 00527 namespace itk \ 00528 { \ 00529 _( 3 ( class EXPORT MatrixOffsetTransformBase<ITK_TEMPLATE_3 TypeX> ) ) \ 00530 namespace Templates \ 00531 { \ 00532 typedef MatrixOffsetTransformBase<ITK_TEMPLATE_3 TypeX> MatrixOffsetTransformBase##TypeY; \ 00533 } \ 00534 } 00535 00536 #if ITK_TEMPLATE_EXPLICIT 00537 // template < class TScalarType, unsigned int NInputDimensions, unsigned int 00538 // NOutputDimensions> 00539 // const unsigned int itk::MatrixOffsetTransformBase< TScalarType, 00540 // NInputDimensions, NOutputDimensions >::InputSpaceDimension; 00541 // template < class TScalarType, unsigned int NInputDimensions, unsigned int 00542 // NOutputDimensions> 00543 // const unsigned int itk::MatrixOffsetTransformBase< TScalarType, 00544 // NInputDimensions, NOutputDimensions >::OutputSpaceDimension; 00545 // template < class TScalarType, unsigned int NInputDimensions, unsigned int 00546 // NOutputDimensions> 00547 // const unsigned int itk::MatrixOffsetTransformBase< TScalarType, 00548 // NInputDimensions, NOutputDimensions >::ParametersDimension; 00549 #include "Templates/itkMatrixOffsetTransformBase+-.h" 00550 #endif 00551 00552 #if ITK_TEMPLATE_TXX 00553 #include "itkMatrixOffsetTransformBase.hxx" 00554 #endif 00555 00556 #endif /* __itkMatrixOffsetTransformBase_h */ 00557