00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkNavigationDataReferenceTransformFilter.h"
00019 #include "mitkNavigationData.h"
00020
00021 #include "mitkTestingMacros.h"
00022
00023 #include <iostream>
00024
00025
00029 int mitkNavigationDataReferenceTransformFilterTest(int , char* [])
00030 {
00031
00032 MITK_TEST_BEGIN("NavigationDataReferenceTransformFilter")
00033
00034
00035 mitk::NavigationDataReferenceTransformFilter::Pointer myFilter = mitk::NavigationDataReferenceTransformFilter::New();
00036
00037
00038
00039
00040 MITK_TEST_CONDITION_REQUIRED(myFilter.IsNotNull(),"Testing instantiation");
00041
00042
00043
00044
00045 mitk::NavigationData::PositionType initialPos1,initialPos2, initialPos3, initialPos4;
00046 mitk::FillVector3D(initialPos1, 11.1, 11.1, 11.1);
00047 mitk::FillVector3D(initialPos2, 22.2, 22.2, 22.2);
00048 mitk::FillVector3D(initialPos3, 33.3, 33.3, 33.3);
00049 mitk::FillVector3D(initialPos4, 44.4, 44.4, 44.4);
00050
00051
00052 mitk::NavigationData::OrientationType initialOri1(0.1, 0.1, 0.1, 0.1);
00053 mitk::NavigationData::OrientationType initialOri2(0.2, 0.2, 0.2, 0.2);
00054 mitk::NavigationData::OrientationType initialOri3(0.3, 0.3, 0.3, 0.3);
00055 mitk::NavigationData::OrientationType initialOri4(0.4, 0.4, 0.4, 0.4);
00056
00057
00058 mitk::ScalarType initialError(0.0);
00059 bool initialValid(true);
00060
00061
00062 mitk::NavigationData::Pointer nd1 = mitk::NavigationData::New();
00063 nd1->SetPosition(initialPos1);
00064 nd1->SetOrientation(initialOri1);
00065 nd1->SetPositionAccuracy(initialError);
00066 nd1->SetDataValid(initialValid);
00067
00068 mitk::NavigationData::Pointer nd2 = mitk::NavigationData::New();
00069 nd2->SetPosition(initialPos2);
00070 nd2->SetOrientation(initialOri2);
00071 nd2->SetPositionAccuracy(initialError);
00072 nd2->SetDataValid(initialValid);
00073
00074 mitk::NavigationData::Pointer nd3 = mitk::NavigationData::New();
00075 nd3->SetPosition(initialPos3);
00076 nd3->SetOrientation(initialOri3);
00077 nd3->SetPositionAccuracy(initialError);
00078 nd3->SetDataValid(initialValid);
00079
00080 mitk::NavigationData::Pointer nd4 = mitk::NavigationData::New();
00081 nd4->SetPosition(initialPos4);
00082 nd4->SetOrientation(initialOri4);
00083 nd4->SetPositionAccuracy(initialError);
00084 nd4->SetDataValid(initialValid);
00085
00086
00087 myFilter->SetInput(0,nd1);
00088 MITK_TEST_CONDITION(myFilter->GetInput(0) == nd1, "Testing Set-/GetInput() ND1");
00089 myFilter->SetInput(1,nd2);
00090 MITK_TEST_CONDITION(myFilter->GetInput(1) == nd2, "Testing Set-/GetInput() ND1");
00091 myFilter->SetInput(2,nd3);
00092 MITK_TEST_CONDITION(myFilter->GetInput(2) == nd3, "Testing Set-/GetInput() ND1");
00093 myFilter->SetInput(3,nd4);
00094 MITK_TEST_CONDITION(myFilter->GetInput(3) == nd4, "Testing Set-/GetInput() ND1");
00095
00096
00097
00098
00099 mitk::NavigationData* output1 = myFilter->GetOutput(0);
00100 MITK_TEST_CONDITION_REQUIRED(output1 != NULL, "Testing GetOutput() ND1");
00101
00102 mitk::NavigationData* output2 = myFilter->GetOutput(1);
00103 MITK_TEST_CONDITION_REQUIRED(output2 != NULL, "Testing GetOutput() ND2");
00104
00105 mitk::NavigationData* output3 = myFilter->GetOutput(2);
00106 MITK_TEST_CONDITION_REQUIRED(output3 != NULL, "Testing GetOutput() ND3");
00107
00108 mitk::NavigationData* output4 = myFilter->GetOutput(3);
00109 MITK_TEST_CONDITION_REQUIRED(output4 != NULL, "Testing GetOutput() ND4");
00110
00111
00112
00113
00114 MITK_TEST_CONDITION_REQUIRED(myFilter->IsInitialized() == false, "Testing IsInitialized() before setting source points");
00115
00116
00117 myFilter->GenerateSourceLandmarks();
00118
00119
00120 std::vector<int>* refIDs = new std::vector<int>();
00121
00122 int refInpt = 0;
00123
00124 refIDs->push_back(refInpt);
00125
00126 myFilter->SetReferenceInputIndexes(refIDs);
00127
00128 MITK_TEST_CONDITION_REQUIRED(myFilter->GetOneSourceRegistration() == true,"Testing switch from OneSourceRegistration false to true" );
00129
00130 MITK_TEST_CONDITION(myFilter->GetReferenceInputIndexes().at(0) == refInpt, "Testing single value of ReferenceInputIndexes");
00131 MITK_TEST_CONDITION_REQUIRED(myFilter->GetReferenceInputIndexes().size()==1, "Testing size of ReferenceInputIndexes");
00132
00133 myFilter->GenerateSourceLandmarks();
00134
00135 MITK_TEST_CONDITION(myFilter->GetSourcePoints().size()==3 && myFilter->GetTargetPoints().size()==0, "Testing different SourcePoints and TargePoints sizes");
00136
00137
00138 MITK_TEST_CONDITION_REQUIRED(myFilter->IsInitialized() == false, "Testing IsInitialized() before setting target points");
00139
00140
00141 myFilter->GenerateTargetLandmarks();
00142
00143 MITK_TEST_CONDITION_REQUIRED(myFilter->IsInitialized() == true, "Testing IsInitialized() after target and source points are set");
00144
00145
00146 mitk::NavigationData::PositionType spos1 = myFilter->GetSourcePoints().at(0);
00147 mitk::NavigationData::PositionType spos2 = myFilter->GetSourcePoints().at(1);
00148 mitk::NavigationData::PositionType spos3 = myFilter->GetSourcePoints().at(2);
00149
00150 mitk::NavigationData::PositionType::RealType distance1 = spos1.EuclideanDistanceTo(spos2);
00151 mitk::NavigationData::PositionType::RealType distance2 = spos1.EuclideanDistanceTo(spos3);
00152
00153 MITK_TEST_CONDITION(mitk::Equal(distance1, distance2), "Testing distance between landmark Point and virtual landmark Points");
00154
00155 MITK_TEST_CONDITION_REQUIRED(myFilter->GetReferencePoints().size() == 0, "Testing ReferencePoints size before initialization");
00156
00157 MITK_TEST_CONDITION_REQUIRED(myFilter->InitializeReferenceLandmarks() == true, "Testing performing InitializeReferenceLandmarks()");
00158 MITK_TEST_CONDITION_REQUIRED(myFilter->GetReferencePoints().size() == myFilter->GetSourcePoints().size(), "Testing ReferencePoints size after initialization");
00159
00160
00161 mitk::NavigationDataReferenceTransformFilter::QuaternionTransformType::Pointer quatTransform = mitk::NavigationDataReferenceTransformFilter::QuaternionTransformType::New();
00162 mitk::NavigationDataReferenceTransformFilter::QuaternionTransformType::Pointer inverseQuatTransform = mitk::NavigationDataReferenceTransformFilter::QuaternionTransformType::New();
00163 mitk::NavigationDataReferenceTransformFilter::QuaternionTransformType::VnlQuaternionType doubleOrientation(initialOri1.x(), initialOri1.y(),initialOri1.z(),initialOri1.r());
00164
00165 quatTransform->SetRotation(doubleOrientation);
00166 quatTransform->SetOffset(initialPos1.GetVectorFromOrigin());
00167 quatTransform->Modified();
00168 quatTransform->GetInverse(inverseQuatTransform);
00169
00170
00171 for(unsigned int i = 0; i < myFilter->GetReferencePoints().size(); ++i)
00172 {
00173 MITK_TEST_CONDITION_REQUIRED(
00174 mitk::Equal(myFilter->GetReferencePoints().at(i), inverseQuatTransform->TransformPoint(myFilter->GetSourcePoints().at(i))), "Testing inverse quaternion transform of SourcePoints");
00175 }
00176
00177
00178
00179 mitk::NavigationData::PositionType newPos1;
00180 mitk::FillVector3D(newPos1, 1.1, -16.1, 21.1);
00181 mitk::NavigationData::OrientationType newOrientation(0.1, 0.2, 0.3, 0.4);
00182 mitk::NavigationData::Pointer newnd1 = mitk::NavigationData::New();
00183 newnd1->SetPosition(newPos1);
00184 newnd1->SetOrientation(newOrientation);
00185 newnd1->SetPositionAccuracy(initialError);
00186 newnd1->SetDataValid(initialValid);
00187
00188
00189 doubleOrientation[0] = newOrientation.x();
00190 doubleOrientation[1] = newOrientation.y();
00191 doubleOrientation[2] = newOrientation.z();
00192 doubleOrientation[3] = newOrientation.r();
00193
00194 quatTransform->SetRotation(doubleOrientation);
00195 quatTransform->SetOffset(newPos1.GetVectorFromOrigin());
00196 quatTransform->Modified();
00197
00198 myFilter->SetInput(0,newnd1);
00199 output1->Update();
00200
00201
00202 for(unsigned int i = 0; i < myFilter->GetReferencePoints().size(); ++i)
00203 {
00204 MITK_TEST_CONDITION_REQUIRED(
00205 mitk::Equal(quatTransform->TransformPoint(myFilter->GetReferencePoints().at(i)), myFilter->GetSourcePoints().at(i)), "Testing quaternion transform of ReferencePoints ") ;
00206 }
00207
00208
00209
00210
00211
00212
00213 refIDs->clear();
00214 refIDs->push_back(0);
00215 refIDs->push_back(1);
00216 refIDs->push_back(2);
00217
00218 myFilter->SetReferenceInputIndexes(refIDs);
00219
00220 bool oneSourceReg = myFilter->GetOneSourceRegistration();
00221 bool refReg = myFilter->GetReferenceRegistration();
00222
00223 MITK_TEST_CONDITION_REQUIRED(oneSourceReg == false && refReg == true,"Testing reference registration bool flags after switching from one reference input to three reference inputs" );
00224 MITK_TEST_CONDITION_REQUIRED(myFilter->GetReferenceInputIndexes().size()==3, "Testing size of ReferenceInputIndexes");
00225
00226 myFilter->GenerateSourceLandmarks();
00227 myFilter->GenerateTargetLandmarks();
00228 MITK_TEST_CONDITION_REQUIRED(myFilter->IsInitialized() == true, "Testing IsInitialized() 3 after reference input source and target points are set");
00229
00230
00231
00232 mitk::Point3D sPoint1, sPoint2, sPoint3, tPoint1, tPoint2, tPoint3;
00233 mitk::FillVector3D(sPoint1, 1.1, 1.1, 1.1);
00234 mitk::FillVector3D(sPoint2, 2.2, 2.2, 2.2);
00235 mitk::FillVector3D(sPoint3, 3.3, 3.3, 3.3);
00236
00237 mitk::FillVector3D(tPoint1, 2.1, 2.1, 2.1);
00238 mitk::FillVector3D(tPoint2, 3.2, 3.2, 3.2);
00239 mitk::FillVector3D(tPoint3, 4.3, 4.3, 4.3);
00240
00241 mitk::PointSet::Pointer sourcePoints = mitk::PointSet::New();
00242 mitk::PointSet::Pointer targetPoints = mitk::PointSet::New();
00243
00244 sourcePoints->SetPoint(0,sPoint1);
00245 sourcePoints->SetPoint(1,sPoint2);
00246 sourcePoints->SetPoint(2,sPoint3);
00247
00248 targetPoints->SetPoint(0,tPoint1);
00249 targetPoints->SetPoint(1,tPoint2);
00250 targetPoints->SetPoint(2,tPoint3);
00251
00252
00253
00254 mitk::NavigationData::PositionType resultPos1, resultPos2;
00255
00256 mitk::FillVector3D(initialPos1, 1.1, 1.1, 1.1);
00257 mitk::FillVector3D(initialPos2, 22.2,22.2, 22.2);
00258 mitk::FillVector3D(resultPos1, 2.1, 2.1, 2.1);
00259 mitk::FillVector3D(resultPos2, 23.2, 23.2, 23.2);
00260 mitk::NavigationData::OrientationType initialOri(0.1, 0.1, 0.1, 0.1);
00261
00262 nd1->SetPosition(initialPos1);
00263 nd1->SetOrientation(initialOri);
00264 nd1->SetPositionAccuracy(initialError);
00265 nd1->SetDataValid(initialValid);
00266
00267 nd2->SetPosition(initialPos2);
00268 nd2->SetOrientation(initialOri);
00269 nd2->SetPositionAccuracy(initialError);
00270 nd2->SetDataValid(initialValid);
00271
00272 myFilter->SetInput(0,nd1);
00273
00274 myFilter->SetSourceLandmarks(sourcePoints);
00275 myFilter->SetTargetLandmarks(targetPoints);
00276
00277 MITK_TEST_CONDITION_REQUIRED(myFilter->GetOneSourceRegistration() == false,"Testing switch from OneSourceRegistration true to false" );
00278
00279
00280
00281
00282
00283
00284 output1->Update();
00285 MITK_TEST_CONDITION_REQUIRED(
00286 mitk::Equal(output1->GetPosition(), resultPos1),
00287 "Testing ND1 position correctly transformed");
00288
00289
00290 myFilter->SetInput(1,nd2);
00291 MITK_TEST_CONDITION(myFilter->GetInput(1) == nd2, "Testing Set-/GetInput() ND2");
00292
00293 output2 = myFilter->GetOutput(1);
00294 MITK_TEST_CONDITION_REQUIRED(output2 != NULL, "Testing GetOutput() ND2");
00295
00296
00297 output1->Update();
00298 MITK_TEST_CONDITION_REQUIRED(
00299 mitk::Equal(output2->GetPosition(), resultPos2),
00300 "Testing ND2 position correctly transformed");
00301
00302
00303 mitk::FillVector3D(initialPos2, 222.22, 222.22, 222.22);
00304 mitk::FillVector3D(resultPos2, 223.22, 223.22, 223.22);
00305 nd2->SetPosition(initialPos2);
00306 myFilter->SetInput(1,nd2);
00307 MITK_TEST_CONDITION(myFilter->GetInput(1) == nd2, "Testing Set-/GetInput() ND2 after updating value");
00308
00309 output2 = myFilter->GetOutput(1);
00310 MITK_TEST_CONDITION_REQUIRED(output2 != NULL, "Testing GetOutput() ND2 after updating value");
00311
00312
00313
00314 output2->Update();
00315 MITK_TEST_CONDITION(
00316 mitk::Equal(output2->GetPosition(), resultPos2),
00317 "Testing ND2 position correctly transformed after updating value");
00318
00319
00320
00321 mitk::FillVector3D(tPoint1, 3.1, 3.1, 3.1);
00322 mitk::FillVector3D(tPoint2, 4.2, 4.2, 4.2);
00323 mitk::FillVector3D(tPoint3, 5.3, 5.3, 5.3);
00324 mitk::FillVector3D(resultPos1, 3.1 ,3.1 ,3.1);
00325 mitk::FillVector3D(resultPos2, 224.22, 224.22, 224.22);
00326
00327
00328 targetPoints->SetPoint(0,tPoint1);
00329 targetPoints->SetPoint(1,tPoint2);
00330 targetPoints->SetPoint(2,tPoint3);
00331
00332 myFilter->SetTargetLandmarks(targetPoints);
00333
00334 output1->Update();
00335
00336 MITK_TEST_CONDITION(
00337 mitk::Equal(output1->GetPosition(), resultPos1),
00338 "Testing ND1 position correctly transformed after targetPointSet changed");
00339
00340 MITK_TEST_CONDITION(
00341 mitk::Equal(output2->GetPosition(), resultPos2),
00342 "Testing ND2 position correctly transformed after targetPointSet changed");
00343
00344
00345 mitk::FillVector3D(sPoint1, 0.1, 0.1, 0.1);
00346 mitk::FillVector3D(sPoint2, 1.2, 1.2, 1.2);
00347 mitk::FillVector3D(sPoint3, 2.3, 2.3, 2.3);
00348 mitk::FillVector3D(resultPos1, 4.1 ,4.1 ,4.1);
00349 mitk::FillVector3D(resultPos2, 225.22, 225.22, 225.22);
00350
00351
00352 sourcePoints->SetPoint(0,sPoint1);
00353 sourcePoints->SetPoint(1,sPoint2);
00354 sourcePoints->SetPoint(2,sPoint3);
00355
00356 myFilter->SetSourceLandmarks(sourcePoints);
00357
00358 output1->Update();
00359
00360 MITK_TEST_CONDITION(
00361 mitk::Equal(output1->GetPosition(), resultPos1),
00362 "Testing ND1 position correctly transformed after sourcePointSet changed");
00363
00364 MITK_TEST_CONDITION(
00365 mitk::Equal(output2->GetPosition(), resultPos2),
00366 "Testing ND2 position correctly transformed after sourcePointSet changed");
00367
00368
00369
00370
00371 myFilter=NULL;
00372 myFilter = mitk::NavigationDataReferenceTransformFilter::New();
00373
00374 mitk::FillVector3D(sPoint1, 1.1, 1.1, 1.1);
00375 mitk::FillVector3D(sPoint2, 1.1, -1.1, 1.1);
00376 mitk::FillVector3D(sPoint3, -1.1, -1.1, 1.1);
00377
00378 mitk::FillVector3D(tPoint1, -1.1, 1.1, 1.1);
00379 mitk::FillVector3D(tPoint2, 1.1, 1.1, 1.1);
00380 mitk::FillVector3D(tPoint3, 1.1, -1.1, 1.1);
00381
00382 sourcePoints->SetPoint(0,sPoint1);
00383 sourcePoints->SetPoint(1,sPoint2);
00384 sourcePoints->SetPoint(2,sPoint3);
00385
00386 targetPoints->SetPoint(0,tPoint1);
00387 targetPoints->SetPoint(1,tPoint2);
00388 targetPoints->SetPoint(2,tPoint3);
00389
00390 myFilter->SetSourceLandmarks(sourcePoints);
00391 myFilter->SetTargetLandmarks(targetPoints);
00392
00393
00394 mitk::NavigationData::OrientationType initialQuat(0.0, 0.0, 0.0, 1.0);
00395 mitk::NavigationData::OrientationType resultQuat(0.0, 0.0, -0.7071, -0.7071);
00396
00397
00398 mitk::FillVector3D(initialPos1, 2.2, 2.2, 2.2);
00399 mitk::FillVector3D(resultPos1, -2.2, 2.2, 2.2);
00400
00401 nd1->SetOrientation(initialQuat);
00402 nd1->SetPosition(initialPos1);
00403
00404 myFilter->SetInput(0,nd1);
00405
00406 output1 = myFilter->GetOutput(0);
00407 output1->Update();
00408
00409 MITK_TEST_CONDITION(
00410 mitk::Equal(output1->GetPosition(), resultPos1),
00411 "Testing ND1 position correctly transformed ");
00412
00413 MITK_TEST_CONDITION(
00414 mitk::Equal(output1->GetOrientation(), resultQuat),
00415 "Testing ND1 orientation correctly transformed ");
00416
00417
00418
00419
00420
00421
00422 delete refIDs;
00423
00424
00425 MITK_TEST_END();
00426 }
00427
00428