Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
itkVtkAbstractTransform.txx
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #include "itkVtkAbstractTransform.h"
14 #include <mitkNumericTypes.h>
15 #include <vtkAbstractTransform.h>
16 
17 namespace itk
18 {
19  template <class TScalarType>
20  itk::VtkAbstractTransform<TScalarType>::VtkAbstractTransform()
21  : m_VtkAbstractTransform(nullptr), m_InverseVtkAbstractTransform(nullptr), m_LastVtkAbstractTransformTimeStamp(0)
22  {
23  }
24 
25  template <class TScalarType>
26  itk::VtkAbstractTransform<TScalarType>::~VtkAbstractTransform()
27  {
28  if (m_VtkAbstractTransform != nullptr)
29  m_VtkAbstractTransform->UnRegister(nullptr);
30  }
31 
32  template <class TScalarType>
33  vtkAbstractTransform *itk::VtkAbstractTransform<TScalarType>::GetVtkAbstractTransform() const
34  {
35  return m_VtkAbstractTransform;
36  }
37 
38  template <class TScalarType>
39  vtkAbstractTransform *itk::VtkAbstractTransform<TScalarType>::GetInverseVtkAbstractTransform() const
40  {
41  return m_InverseVtkAbstractTransform;
42  }
43 
44  template <class TScalarType>
45  void itk::VtkAbstractTransform<TScalarType>::SetVtkAbstractTransform(vtkAbstractTransform *aVtkAbstractTransform)
46  {
47  if (m_VtkAbstractTransform == aVtkAbstractTransform)
48  return;
49 
50  if (m_VtkAbstractTransform != nullptr)
51  m_VtkAbstractTransform->UnRegister(nullptr);
52 
53  m_VtkAbstractTransform = aVtkAbstractTransform;
54  if (m_VtkAbstractTransform != nullptr)
55  {
56  m_VtkAbstractTransform->Register(nullptr);
57  m_InverseVtkAbstractTransform = m_VtkAbstractTransform->GetInverse(); // memory managed by m_VtkAbstractTransform
58  }
59 
60  m_LastVtkAbstractTransformTimeStamp = m_VtkAbstractTransform->GetMTime();
61 
62  this->Modified();
63  }
64 
65  // Transform a point
66  template <class TScalarType>
67  typename itk::VtkAbstractTransform<TScalarType>::OutputPointType
68  itk::VtkAbstractTransform<TScalarType>::TransformPoint(const InputPointType &point) const
69  {
70  assert(m_VtkAbstractTransform != nullptr);
71 
72  OutputPointType outputpoint;
73  vnl_vector<TScalarType> vnl_vec;
74  mitk::ScalarType vtkpt[3];
75  mitk::itk2vtk(point, vtkpt);
76  m_VtkAbstractTransform->TransformPoint(vtkpt, vtkpt);
77  mitk::vtk2itk(vtkpt, outputpoint);
78  return outputpoint;
79  }
80 
81  // Transform a vector
82  template <class TScalarType>
83  typename itk::VtkAbstractTransform<TScalarType>::OutputVectorType
84  itk::VtkAbstractTransform<TScalarType>::TransformVector(const InputVectorType &vect) const
85  {
86  assert(m_VtkAbstractTransform != nullptr);
87 
88  OutputVectorType outputvector;
89  vnl_vector<TScalarType> vnl_vec;
90  mitk::ScalarType vtkpt[3] = {0, 0, 0};
91  mitk::ScalarType vtkvec[3];
92  mitk::vnl2vtk<TScalarType, mitk::ScalarType>(vect.GetVnlVector(), vtkvec);
93  m_VtkAbstractTransform->TransformVectorAtPoint(vtkpt, vtkvec, vtkvec);
94  mitk::vtk2itk(vtkvec, outputvector);
95  return outputvector;
96  }
97 
98  // Transform a vnl_vector_fixed
99  template <class TScalarType>
100  typename itk::VtkAbstractTransform<TScalarType>::OutputVnlVectorType
101  itk::VtkAbstractTransform<TScalarType>::TransformVector(const InputVnlVectorType &vect) const
102  {
103  assert(m_VtkAbstractTransform != nullptr);
104 
105  OutputVnlVectorType outputvector;
106  mitk::ScalarType vtkpt[3] = {0, 0, 0};
107  mitk::ScalarType vtkvec[3];
108  mitk::vnl2vtk<TScalarType, mitk::ScalarType>(vect, vtkvec);
109  m_VtkAbstractTransform->TransformVectorAtPoint(vtkpt, vtkvec, vtkvec);
110  mitk::vtk2itk(vtkvec, outputvector);
111  return outputvector;
112  }
113 
114  // Transform a CovariantVector
115  template <class TScalarType>
116  typename itk::VtkAbstractTransform<TScalarType>::OutputCovariantVectorType
117  itk::VtkAbstractTransform<TScalarType>::TransformCovariantVector(const InputCovariantVectorType & /*vec*/) const
118  {
119  itkExceptionMacro(<< "implement before using!");
120  OutputCovariantVectorType result; // Converted vector
121 
122  // for (unsigned int i = 0; i < NDimensions; i++)
123  // {
124  // result[i] = NumericTraits<mitk::ScalarType>::Zero;
125  // for (unsigned int j = 0; j < NDimensions; j++)
126  // {
127  // result[i] += m_Inverse[j][i]*vec[j]; // Inverse transposed
128  // }
129  // }
130  return result;
131  }
132 
133  // Back transform a point
134  template <class TScalarType>
135  typename VtkAbstractTransform<TScalarType>::InputPointType itk::VtkAbstractTransform<TScalarType>::BackTransform(
136  const OutputPointType &point) const
137  {
138  assert(m_VtkAbstractTransform != nullptr);
139 
140  OutputPointType outputpoint;
141  mitk::ScalarType vtkpt[3];
142  mitk::itk2vtk(point, vtkpt);
143  m_InverseVtkAbstractTransform->TransformPoint(vtkpt, vtkpt);
144  mitk::vtk2itk(vtkpt, outputpoint);
145  return outputpoint;
146  }
147 
148  // Back transform a vector
149  template <class TScalarType>
150  typename VtkAbstractTransform<TScalarType>::InputVectorType itk::VtkAbstractTransform<TScalarType>::BackTransform(
151  const OutputVectorType &vect) const
152  {
153  assert(m_VtkAbstractTransform != nullptr);
154 
155  OutputVectorType outputvector;
156  mitk::ScalarType vtkpt[3] = {0, 0, 0};
157  mitk::ScalarType vtkvec[3];
158  mitk::itk2vtk(vect, vtkvec);
159  m_InverseVtkAbstractTransform->TransformVectorAtPoint(vtkpt, vtkvec, vtkvec);
160  mitk::vtk2itk(vtkvec, outputvector);
161  return outputvector;
162  }
163 
164  // Back transform a vnl_vector
165  template <class TScalarType>
166  typename VtkAbstractTransform<TScalarType>::InputVnlVectorType itk::VtkAbstractTransform<TScalarType>::BackTransform(
167  const OutputVnlVectorType &vect) const
168  {
169  assert(m_InverseVtkAbstractTransform != nullptr);
170 
171  OutputVnlVectorType outputvector;
172  mitk::ScalarType vtkpt[3] = {0, 0, 0};
173  mitk::ScalarType vtkvec[3];
174  mitk::itk2vtk(vect, vtkvec);
175  m_InverseVtkAbstractTransform->TransformVectorAtPoint(vtkpt, vtkvec, vtkvec);
176  mitk::vtk2itk(vtkvec, outputvector);
177  return outputvector;
178  }
179 
180  // Back Transform a CovariantVector
181  template <class TScalarType>
182  typename VtkAbstractTransform<TScalarType>::InputCovariantVectorType
183  itk::VtkAbstractTransform<TScalarType>::BackTransform(const OutputCovariantVectorType &vec) const
184  {
185  itkExceptionMacro(<< "implement before using!");
186  // for (unsigned int i = 0; i < NDimensions; i++)
187  // {
188  // result[i] = NumericTraits<mitk::ScalarType>::Zero;
189  // for (unsigned int j = 0; j < NDimensions; j++)
190  // {
191  // result[i] += m_Matrix[j][i]*vec[j]; // Direct matrix transposed
192  // }
193  // }
194  return vec;
195  }
196 
197  template <class TScalarType>
198  unsigned long itk::VtkAbstractTransform<TScalarType>::GetMTime() const
199  {
200  if ((m_VtkAbstractTransform != nullptr) &&
201  (m_LastVtkAbstractTransformTimeStamp < m_VtkAbstractTransform->GetMTime()))
202  {
203  m_LastVtkAbstractTransformTimeStamp = m_VtkAbstractTransform->GetMTime();
204  this->Modified();
205  }
206 
207  return Superclass::GetMTime();
208  }
209 
210  template <class TScalarType>
211  void itk::VtkAbstractTransform<TScalarType>::SetParameters(const ParametersType &)
212  {
213  // TODO
214  }
215 
216  template <class TScalarType>
217  void itk::VtkAbstractTransform<TScalarType>::SetFixedParameters(const ParametersType &)
218  {
219  // TODO
220  }
221 
222  template <class TScalarType>
223  void itk::VtkAbstractTransform<TScalarType>::ComputeJacobianWithRespectToParameters(const InputPointType &,
224  JacobianType &) const
225  {
226  // TODO
227  }
228 
229  template <class TScalarType>
230  void itk::VtkAbstractTransform<TScalarType>::ComputeJacobianWithRespectToPosition(const InputPointType &,
231  JacobianType &) const
232  {
233  // TODO
234  }
235 
236 } // namespace itk