MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
mitkNavigationDataReferenceTransformFilterTest.cpp
Go to the documentation of this file.
1/*============================================================================
2
3The Medical Imaging Interaction Toolkit (MITK)
4
5Copyright (c) German Cancer Research Center (DKFZ)
6All rights reserved.
7
8Use of this source code is governed by a 3-clause BSD license that can be
9found in the LICENSE file.
10
11============================================================================*/
12
14#include "mitkNavigationData.h"
15
16#include "mitkTestingMacros.h"
17
18#include <itkQuaternionRigidTransform.h>
19
20#include <iostream>
21
22
26int mitkNavigationDataReferenceTransformFilterTest(int /* argc */, char* /*argv*/[])
27{
28
29 MITK_TEST_BEGIN("NavigationDataReferenceTransformFilter")
30
31 // let's create an object of our class
32 mitk::NavigationDataReferenceTransformFilter::Pointer myFilter = mitk::NavigationDataReferenceTransformFilter::New();
33
34 // first test: did this work?
35 // using MITK_TEST_CONDITION_REQUIRED makes the test stop after failure, since
36 // it makes no sense to continue without an object.
37 MITK_TEST_CONDITION_REQUIRED(myFilter.IsNotNull(),"Testing instantiation");
38
39
40 /*create helper objects: positions of the ND sources*/
41 mitk::Point3D sourcePos1,sourcePos2, sourcePos3, targetPos1, targetPos2, targetPos3;
42 mitk::FillVector3D(sourcePos1, 11.1, 11.1, 11.1);
43 mitk::FillVector3D(sourcePos2, 22.2, 22.2, 22.2);
44 mitk::FillVector3D(sourcePos3, 33.3, 33.3, 33.3);
45 mitk::FillVector3D(targetPos1, -1.1, -2.2, -3.3);
46 mitk::FillVector3D(targetPos2, -4.4, -5.5, -6.6);
47 mitk::FillVector3D(targetPos3, -7.7, -8.8, -9.9);
48
49 /*create helper objects: orientations of the ND sources*/
50 mitk::NavigationData::OrientationType sourceOri1(0.1, 0.1, 0.1, 0.1);
51 mitk::NavigationData::OrientationType sourceOri2(0.2, 0.2, 0.2, 0.2);
52 mitk::NavigationData::OrientationType sourceOri3(0.3, 0.3, 0.3, 0.3);
53 mitk::NavigationData::OrientationType targetOri1(0.4, 0.4, 0.4, 0.4);
54 mitk::NavigationData::OrientationType targetOri2(0.5, 0.5, 0.5, 0.5);
55 mitk::NavigationData::OrientationType targetOri3(0.6, 0.6, 0.6, 0.6);
56
57 /*create helper objects: ND position accurancy and validity bool*/
58 mitk::ScalarType initialError(0.0);
59 bool initialValid(true);
60
61 /*create helper objects: NDs for the source and target NDs*/
62 mitk::NavigationData::Pointer snd1 = mitk::NavigationData::New();
63 snd1->SetPosition(sourcePos1);
64 snd1->SetOrientation(sourceOri1);
65 snd1->SetPositionAccuracy(initialError);
66 snd1->SetDataValid(initialValid);
67
68 mitk::NavigationData::Pointer snd2 = mitk::NavigationData::New();
69 snd2->SetPosition(sourcePos2);
70 snd2->SetOrientation(sourceOri2);
71 snd2->SetPositionAccuracy(initialError);
72 snd2->SetDataValid(initialValid);
73
74 mitk::NavigationData::Pointer snd3 = mitk::NavigationData::New();
75 snd3->SetPosition(sourcePos3);
76 snd3->SetOrientation(sourceOri3);
77 snd3->SetPositionAccuracy(initialError);
78 snd3->SetDataValid(initialValid);
79
80 mitk::NavigationData::Pointer tnd1 = mitk::NavigationData::New();
81 tnd1->SetPosition(targetPos1);
82 tnd1->SetOrientation(targetOri1);
83 tnd1->SetPositionAccuracy(initialError);
84 tnd1->SetDataValid(initialValid);
85
86 mitk::NavigationData::Pointer tnd2 = mitk::NavigationData::New();
87 tnd2->SetPosition(targetPos2);
88 tnd2->SetOrientation(targetOri2);
89 tnd2->SetPositionAccuracy(initialError);
90 tnd2->SetDataValid(initialValid);
91
92 mitk::NavigationData::Pointer tnd3 = mitk::NavigationData::New();
93 tnd3->SetPosition(targetPos3);
94 tnd3->SetOrientation(targetOri3);
95 tnd3->SetPositionAccuracy(initialError);
96 tnd3->SetDataValid(initialValid);
97
98 std::vector<mitk::NavigationData::Pointer> emptySourceNDs;
99
100 std::vector<mitk::NavigationData::Pointer> oneSourceNDs;
101 oneSourceNDs.push_back(snd1);
102
103 std::vector<mitk::NavigationData::Pointer> twoSourceNDs;
104 twoSourceNDs.push_back(snd1);
105 twoSourceNDs.push_back(snd2);
106
107 std::vector<mitk::NavigationData::Pointer> threeSourceNDs;
108 threeSourceNDs.push_back(snd1);
109 threeSourceNDs.push_back(snd2);
110 threeSourceNDs.push_back(snd3);
111
112 std::vector<mitk::NavigationData::Pointer> emptyTargetNDs;
113
114 std::vector<mitk::NavigationData::Pointer> oneTargetNDs;
115 oneTargetNDs.push_back(tnd1);
116
117 std::vector<mitk::NavigationData::Pointer> twoTargetNDs;
118 twoTargetNDs.push_back(tnd1);
119 twoTargetNDs.push_back(tnd2);
120
121 std::vector<mitk::NavigationData::Pointer> threeTargetNDs;
122 threeTargetNDs.push_back(tnd1);
123 threeTargetNDs.push_back(tnd2);
124 threeTargetNDs.push_back(tnd3);
125
126 // ------------------ setting no NDs ------------------
127
128 myFilter->SetSourceNavigationDatas(emptySourceNDs);
129 MITK_TEST_CONDITION_REQUIRED(myFilter->GetSourceLandmarks()->IsEmpty() == true, "Testing behaviour if setting no source NDs");
130
131 myFilter->SetSourceNavigationDatas(emptyTargetNDs);
132 MITK_TEST_CONDITION_REQUIRED(myFilter->GetTargetLandmarks()->IsEmpty() == true, "Testing behaviour if setting no target NDs");
133
134 // ------------------ setting one ND ------------------
135 myFilter->SetSourceNavigationDatas(oneSourceNDs);
136 MITK_TEST_CONDITION_REQUIRED(myFilter->GetSourceLandmarks()->GetSize() == 3, "Testing if 3 source points are generated from one source ND");
137
138 myFilter->SetTargetNavigationDatas(oneTargetNDs);
139 MITK_TEST_CONDITION_REQUIRED(myFilter->GetTargetLandmarks()->GetSize() == 3, "Testing if 3 target points are generated from one target ND");
140
141 // ------------------ setting two NDs ------------------
142 myFilter->SetSourceNavigationDatas(twoSourceNDs);
143 MITK_TEST_CONDITION_REQUIRED(myFilter->GetSourceLandmarks()->GetSize() == 6, "Testing if 6 source points are generated from two source NDs");
144
145 myFilter->SetTargetNavigationDatas(twoTargetNDs);
146 MITK_TEST_CONDITION_REQUIRED(myFilter->GetTargetLandmarks()->GetSize() == 6, "Testing if 6 target points are generated from two target NDs");
147
148 // ------------------ setting three NDs ------------------
149 myFilter->SetSourceNavigationDatas(threeSourceNDs);
150 MITK_TEST_CONDITION_REQUIRED(myFilter->GetSourceLandmarks()->GetSize() == 3, "Testing if 3 source NDs are passed to 3 source points");
151
152 myFilter->SetTargetNavigationDatas(threeTargetNDs);
153 MITK_TEST_CONDITION_REQUIRED(myFilter->GetTargetLandmarks()->GetSize() == 3, "Testing if 3 target NDs are passed to 3 target points");
154
155
156
157 // ------------------ setting different number of NDs for source and target ------------------
158 bool firstInitialize = myFilter->InitializeTransform();
159 myFilter->SetTargetNavigationDatas(twoTargetNDs);
160 MITK_TEST_CONDITION_REQUIRED((firstInitialize == true && myFilter->InitializeTransform() == false), "Testing if initialization is denied, if different number of source and target NDs are set");
161
162 // ------------------ reinit of this filter ------------------
163 bool sourcePointsSet = myFilter->GetSourceLandmarks()->GetSize() > 0;
164 bool targetPointsSet = myFilter->GetTargetLandmarks()->GetSize() > 0;
165 MITK_TEST_CONDITION_REQUIRED(sourcePointsSet && targetPointsSet, "Testing if there are source and target landmarks set in the superclass");
166
167 myFilter->ReinitFilter();
168 bool sourcePointsCleared = myFilter->GetSourceLandmarks()->GetSize() == 0;
169 bool targetPointsCleared = myFilter->GetTargetLandmarks()->GetSize() == 0;
170 MITK_TEST_CONDITION_REQUIRED(sourcePointsCleared && targetPointsCleared, "Testing if reinit of filter was successful");
171
172 // ------------------ testing the point generation ------------------
173
174 myFilter->SetSourceNavigationDatas(oneSourceNDs); // set the ND with sourcePos1 and sourceOri1 for that the points will be generated
175
176 itk::QuaternionRigidTransform<double>::Pointer quaternionTransform = itk::QuaternionRigidTransform<double>::New();
177 vnl_quaternion<double> const vnlQuatIn(sourceOri1.x(), sourceOri1.y(), sourceOri1.z(), sourceOri1.r());
178 quaternionTransform->SetRotation(vnlQuatIn);
179
180 mitk::Point3D pointA;
181 mitk::Point3D pointB;
182 mitk::Point3D pointC;
183
184 //initializing three points with position(0|0|0)
185 pointA.Fill(0);
186 pointB.Fill(0);
187 pointC.Fill(0);
188
189 // changing position off all points in order to make them orthogonal
190 pointA[0] = 1;
191 pointB[1] = 1;
192 pointC[2] = 1;
193
194 // quaternion transform the points
195 pointA = quaternionTransform->GetMatrix() * pointA;
196 pointB = quaternionTransform->GetMatrix() * pointB;
197 pointC = quaternionTransform->GetMatrix() * pointC;
198
199 // now subtract them from the filter landmarks and compare them to the source pos
200
201 pointA = mitk::Point3D(myFilter->GetSourceLandmarks()->GetPoint(0)-pointA);
202 pointB = mitk::Point3D(myFilter->GetSourceLandmarks()->GetPoint(1)-pointB);
203 pointC = mitk::Point3D(myFilter->GetSourceLandmarks()->GetPoint(2)-pointC);
204
205 MITK_TEST_CONDITION_REQUIRED(mitk::Equal(sourcePos1,pointA,mitk::eps,true), "Testing if point generation of first point is correct");
206 MITK_TEST_CONDITION_REQUIRED(mitk::Equal(sourcePos1,pointB,mitk::eps,true), "Testing if point generation of second point is correct");
207 MITK_TEST_CONDITION_REQUIRED(mitk::Equal(sourcePos1,pointC,mitk::eps,true), "Testing if point generation of third point is correct");
208
209 // deleting helper objects
210 myFilter = nullptr;
211 quaternionTransform = nullptr;
212 snd1 = nullptr;
213 snd2 = nullptr;
214 snd3 = nullptr;
215 tnd1 = nullptr;
216 tnd2 = nullptr;
217 tnd3 = nullptr;
218
219 // always end with this!
220 MITK_TEST_END();
221}
222
223
mitk::Quaternion OrientationType
Type that holds the orientation part of the tracking data.
int mitkNavigationDataReferenceTransformFilterTest(int, char *[])
MITKIGTBASE_EXPORT bool Equal(const mitk::NavigationData &leftHandSide, const mitk::NavigationData &rightHandSide, ScalarType eps=mitk::eps, bool verbose=false)
Equal A function comparing two navigation data objects for beeing equal in meta- and imagedata.