Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkNavigationDataTransformFilter.h"
00019
00020
00021 mitk::NavigationDataTransformFilter::NavigationDataTransformFilter()
00022 : mitk::NavigationDataToNavigationDataFilter()
00023 {
00024 m_Transform = NULL;
00025
00026
00027 m_QuatOrgRigidTransform = itk::QuaternionRigidTransform<double>::New();
00028 m_QuatTmpTransform = itk::QuaternionRigidTransform<double>::New();
00029 }
00030
00031
00032 mitk::NavigationDataTransformFilter::~NavigationDataTransformFilter()
00033 {
00034 m_Transform = NULL;
00035 }
00036
00037 void mitk::NavigationDataTransformFilter::SetRigid3DTransform( TransformType::Pointer transform )
00038 {
00039 m_Transform = transform;
00040 this->Modified();
00041 }
00042
00043 void mitk::NavigationDataTransformFilter::GenerateData()
00044 {
00045
00046
00047 if(m_Transform.IsNull())
00048 {
00049 itkExceptionMacro("Invalid parameter: Transform was not set! Use SetRigid3DTransform() before updating the filter.");
00050 return;
00051 }
00052 else
00053 {
00054 this->CreateOutputsForAllInputs();
00055
00056
00057 for (unsigned int i = 0; i < this->GetNumberOfOutputs() ; ++i)
00058 {
00059 mitk::NavigationData* output = this->GetOutput(i);
00060 assert(output);
00061 const mitk::NavigationData* input = this->GetInput(i);
00062 assert(input);
00063
00064 if (input->IsDataValid() == false)
00065 {
00066 output->SetDataValid(false);
00067 continue;
00068 }
00069
00070 mitk::NavigationData::PositionType tempCoordinateIn, tempCoordinateOut;
00071 tempCoordinateIn = input->GetPosition();
00072
00073 itk::Point<float,3> itkPointIn, itkPointOut;
00074 itkPointIn[0] = tempCoordinateIn[0];
00075 itkPointIn[1] = tempCoordinateIn[1];
00076 itkPointIn[2] = tempCoordinateIn[2];
00077
00078
00079 itkPointOut = m_Transform->TransformPoint( itkPointIn );
00080
00081 tempCoordinateOut[0] = itkPointOut[0];
00082 tempCoordinateOut[1] = itkPointOut[1];
00083 tempCoordinateOut[2] = itkPointOut[2];
00084
00085 output->Graft(input);
00086 output->SetPosition(tempCoordinateOut);
00087 output->SetDataValid(true);
00088
00089
00090 NavigationData::OrientationType quatIn = input->GetOrientation();
00091 vnl_quaternion<double> const vnlQuatIn(quatIn.x(), quatIn.y(), quatIn.z(), quatIn.r());
00092
00093 itk::Matrix<float,3,3> rotMatrix = m_Transform->GetMatrix();
00094 itk::Matrix<double,3,3> rotMatrixD;
00095
00096 mitk::TransferMatrix(rotMatrix,rotMatrixD);
00097
00098 m_QuatOrgRigidTransform->SetRotationMatrix(rotMatrixD);
00099 m_QuatTmpTransform->SetRotation(vnlQuatIn);
00100 m_QuatTmpTransform->Compose(m_QuatOrgRigidTransform,false);
00101
00102 vnl_quaternion<double> vnlQuatOut = m_QuatTmpTransform->GetRotation();
00103 NavigationData::OrientationType quatOut(vnlQuatOut[0], vnlQuatOut[1], vnlQuatOut[2], vnlQuatOut[3]);
00104
00105 output->SetOrientation(quatOut);
00106
00107
00108 }
00109 }
00110 }
00111