13#include "mitkTestingMacros.h"
15#include "mitkVector.h"
16#include <vnl/vnl_math.h>
25static bool AreBasicNavigationMembersEqual(
const NavigationData::Pointer nd,
const bool dataValid,
29 result = result && (nd->IsDataValid() == dataValid);
30 result = result && (
mitk::Equal(nd->GetIGTTimeStamp(), timeStamp));
31 result = result && (0 == name.compare(nd->GetName()));
40static bool AreBasicNavigationMembersEqual(
const NavigationData::Pointer nd1,
const NavigationData::Pointer nd2)
42 return AreBasicNavigationMembersEqual(nd1, nd2->IsDataValid(),
43 nd2->GetIGTTimeStamp(),
56static bool AreCovarianceNavigationMembersEqual(
const NavigationData::Pointer nd,
bool hasPosition,
60 result = result && (nd->GetHasPosition() == hasPosition);
61 result = result && (nd->GetHasOrientation() == hasOrientation);
62 result = result && (mitk::MatrixEqualElementWise(nd->GetCovErrorMatrix(), covMatrix));
76static bool AreCovarianceNavigationMembersEqual(
const NavigationData::Pointer nd1,
const NavigationData::Pointer nd2)
78 return AreCovarianceNavigationMembersEqual(nd1,
79 nd2->GetHasPosition(), nd2->GetHasOrientation(), nd2->GetCovErrorMatrix());
88static mitk::NavigationData::Pointer GetTestData()
90 mitk::NavigationData::Pointer nd = mitk::NavigationData::New();
92 mitk::FillVector3D(p, 44.4, 55.5, 66.66);
95 nd->SetOrientation(o);
96 nd->SetDataValid(
true);
97 nd->SetIGTTimeStamp(100.111);
98 nd->SetHasPosition(
false);
99 nd->SetHasOrientation(
false);
103 nd->SetCovErrorMatrix(m);
104 nd->SetName(
"my NavigationData");
105 nd->SetPositionAccuracy(100.0);
106 nd->SetOrientationAccuracy(10.0);
111static void TestInstatiation()
114 mitk::NavigationData::Pointer nd = mitk::NavigationData::New();
115 MITK_TEST_CONDITION(nd.IsNotNull(),
"Test instatiation");
119static void TestGetterSetter()
121 mitk::NavigationData::Pointer nd = mitk::NavigationData::New();
124 mitk::FillVector3D(p, 44.4, 55.5, 66.66);
126 MITK_TEST_CONDITION(nd->GetPosition() == p,
"Set-/GetPosition()");
129 nd->SetOrientation(o);
130 MITK_TEST_CONDITION(nd->GetOrientation() == o,
"Set-/GetOrientation()");
132 nd->SetDataValid(
true);
133 MITK_TEST_CONDITION(nd->IsDataValid() ==
true,
"Set-/IsDataValid()");
135 nd->SetIGTTimeStamp(100.111);
136 MITK_TEST_CONDITION(
mitk::Equal(nd->GetIGTTimeStamp(), 100.111),
"Set-/GetIGTTimeStamp()");
138 nd->SetHasPosition(
false);
139 MITK_TEST_CONDITION(nd->GetHasPosition() ==
false,
"Set-/GetHasPosition()");
141 nd->SetHasOrientation(
false);
142 MITK_TEST_CONDITION(nd->GetHasOrientation() ==
false,
"Set-/GetHasOrientation()");
147 nd->SetCovErrorMatrix(m);
148 MITK_TEST_CONDITION(nd->GetCovErrorMatrix() == m,
"Set-/GetCovErrorMatrix()");
150 nd->SetName(
"my NavigationData");
151 MITK_TEST_CONDITION(std::string(nd->GetName()) ==
"my NavigationData",
"Set-/GetName()");
153 nd->SetPositionAccuracy(100.0);
155 MITK_TEST_CONDITION(
mitk::Equal(result(0, 0), 10000.0)
157 &&
mitk::Equal(result(2, 2), 10000.0),
"SetPositionAccuracy()");
159 nd->SetOrientationAccuracy(10.0);
161 MITK_TEST_CONDITION(
mitk::Equal(result2(3, 3), 100.0)
163 &&
mitk::Equal(result2(5, 5), 100.0),
"SetOrientationAccuracy()");
166static void TestGraft()
169 mitk::NavigationData::Pointer nd = GetTestData();
171 mitk::NavigationData::Pointer graftedCopy = mitk::NavigationData::New();
172 graftedCopy->Graft(nd);
174 bool graftIsEqual = (nd->GetPosition() == graftedCopy->GetPosition())
175 && (nd->GetOrientation() == graftedCopy->GetOrientation())
176 && AreCovarianceNavigationMembersEqual(nd, graftedCopy)
177 && AreBasicNavigationMembersEqual(nd, graftedCopy);
179 MITK_TEST_CONDITION(graftIsEqual,
"Graft() produces equal NavigationData object");
182static void TestPrintSelf()
184 mitk::NavigationData::Pointer nd = GetTestData();
185 itk::Indent myIndent = itk::Indent();
187 MITK_TEST_OUTPUT(<<
"Testing method PrintSelf(), method output will follow:");
191 nd->PrintSelf(std::cout,myIndent);
197 MITK_TEST_CONDITION(success,
"Testing method PrintSelf().");
201static void TestWrongInputs()
203 mitk::NavigationData::Pointer nd = GetTestData();
206 bool success =
false;
209 nd->CopyInformation(
nullptr);
211 catch(itk::ExceptionObject&)
215 MITK_TEST_CONDITION(success,
"Testing wrong input for method CopyInformation.");
224 catch(itk::ExceptionObject&)
228 MITK_TEST_CONDITION(success,
"Testing wrong input for method Graft.");
232static mitk::Quaternion quaternion;
233static mitk::Quaternion quaternion_realistic;
234static mitk::Vector3D offsetVector;
235static mitk::Point3D offsetPoint;
236static mitk::Matrix3D rotation;
238static mitk::Quaternion quaternion2;
239static mitk::Vector3D offsetVector2;
240static mitk::Point3D offsetPoint2;
241static mitk::Matrix3D rotation2;
243static mitk::Point3D point;
248static void SetupNaviDataTests()
264 quaternion = mitk::Quaternion(0, 0, 0.7071067811865475, 0.7071067811865476);
267 quaternion_realistic = mitk::Quaternion(-0.57747,0.225593,0.366371,0.693933);
270 double offsetArray[3] = {1.0,2.0,3.123456};
271 offsetVector = offsetArray;
272 offsetPoint = offsetArray;
284 rotation2[1][2] = -1;
287 quaternion2 = mitk::Quaternion(0.7071067811865475, 0, 0, 0.7071067811865476);
288 mitk::ScalarType offsetArray2[3] = {1, 0, 0};
289 offsetVector2 = offsetArray2;
290 offsetPoint2 = offsetArray2;
293 mitk::ScalarType pointArray[] = {1.0, 3.0, 5.0};
300static mitk::NavigationData::Pointer CreateNavidata(mitk::Quaternion quaternion, mitk::Point3D offset)
302 mitk::NavigationData::Pointer navigationData = mitk::NavigationData::New();
303 navigationData->SetOrientation(quaternion);
304 navigationData->SetPosition(offset);
306 return navigationData;
316static mitk::AffineTransform3D::Pointer CreateAffineTransform(mitk::Matrix3D rotationMatrix, mitk::Vector3D offset)
318 mitk::AffineTransform3D::Pointer affineTransform3D = mitk::AffineTransform3D::New();
319 affineTransform3D->SetOffset(offset);
320 affineTransform3D->SetMatrix(rotationMatrix);
322 return affineTransform3D;
388static void TestDoubleInverse()
390 SetupNaviDataTests();
391 mitk::NavigationData::Pointer nd = CreateNavidata(quaternion, offsetPoint);
393 mitk::NavigationData::Pointer ndDoubleInverse = nd->GetInverse()->GetInverse();
395 MITK_TEST_CONDITION(
mitk::Equal(nd->GetOrientation(), ndDoubleInverse->GetOrientation()),
"Testing GetInverse double application: orientation preserved");
396 MITK_TEST_CONDITION(
mitk::Equal(nd->GetPosition(), ndDoubleInverse->GetPosition()),
"Testing GetInverse double application: position preserved");
403static void TestInverseError()
406 mitk::NavigationData::Pointer nd = mitk::NavigationData::New();
407 mitk::Quaternion quaternion;
409 nd->SetOrientation(quaternion);
411 MITK_TEST_FOR_EXCEPTION(mitk::Exception, nd->GetInverse());
417static void TestTransform()
419 SetupNaviDataTests();
420 mitk::NavigationData::Pointer navigationData = CreateNavidata(quaternion, offsetPoint);
422 point = navigationData->TransformPoint(point);
424 mitk::ScalarType resultingPointArray[] = {-2, 3, 8.123456};
425 mitk::Point3D resultingPoint = resultingPointArray;
426 MITK_TEST_CONDITION(
mitk::Equal(resultingPoint, point),
"Testing point transformation");
433static void TestAffineConstructor()
435 SetupNaviDataTests();
436 mitk::AffineTransform3D::Pointer affineTransform3D = CreateAffineTransform(rotation, offsetVector);
438 mitk::NavigationData::Pointer navigationData = mitk::NavigationData::New(affineTransform3D);
441 MITK_TEST_CONDITION(AreBasicNavigationMembersEqual(navigationData,
true, 0.0,
""),
442 "Testing affine constructor: dataValid, timeStamp and name have been initialized to default values");
445 MITK_TEST_CONDITION(AreCovarianceNavigationMembersEqual(navigationData,
true,
true, covMatrix),
446 "Testing affine constructor: covariance matrix values have been correctly initialized");
449 MITK_TEST_CONDITION(
mitk::Equal(navigationData->GetPosition(), offsetPoint),
"Testing affine constructor: offset");
450 MITK_TEST_CONDITION(
mitk::Equal(navigationData->GetOrientation(), quaternion),
"Testing affine constructor: quaternion");
457static void TestAffineConstructorErrorTransposedNotInverse()
459 SetupNaviDataTests();
460 rotation.SetIdentity();
462 mitk::AffineTransform3D::Pointer affineTransform3D = CreateAffineTransform(rotation, offsetVector);
464 MITK_TEST_FOR_EXCEPTION(mitk::Exception, mitk::NavigationData::New(affineTransform3D));
471static void TestAffineConstructorErrorDeterminantNonEqualOne()
473 SetupNaviDataTests();
474 rotation.SetIdentity();
476 mitk::AffineTransform3D::Pointer affineTransform3D = CreateAffineTransform(rotation, offsetVector);
478 MITK_TEST_FOR_EXCEPTION(mitk::Exception, mitk::NavigationData::New(affineTransform3D));
486static void TestAffineConstructorErrorCheckingFalse()
488 SetupNaviDataTests();
489 rotation.SetIdentity();
491 mitk::AffineTransform3D::Pointer affineTransform3D = CreateAffineTransform(rotation, offsetVector);
493 bool exceptionSuppressed =
true;
496 mitk::NavigationData::New(affineTransform3D,
false);
498 catch (mitk::Exception&)
500 exceptionSuppressed =
false;
503 MITK_TEST_CONDITION(exceptionSuppressed,
"Test affine constructor: exception can be suppressed.")
509static void TestAffineGetter()
511 SetupNaviDataTests();
512 mitk::NavigationData::Pointer navigationData = CreateNavidata(quaternion, offsetPoint);
514 mitk::AffineTransform3D::Pointer affineTransform = navigationData->GetAffineTransform3D();
516 MITK_TEST_CONDITION(
mitk::Equal(affineTransform->GetOffset(), offsetVector),
"Testing AffineTransform3D getter: offset");
517 MITK_TEST_CONDITION(mitk::MatrixEqualElementWise(affineTransform->GetMatrix(), rotation),
"Testing AffineTransform3D getter: rotation");
523static void TestAffineToNaviDataToAffine()
525 SetupNaviDataTests();
526 mitk::AffineTransform3D::Pointer affineTransform3D = CreateAffineTransform(rotation, offsetVector);
529 mitk::NavigationData::Pointer navigationData = mitk::NavigationData::New(affineTransform3D);
530 mitk::AffineTransform3D::Pointer affineTransform3D_2;
531 affineTransform3D_2 = navigationData->GetAffineTransform3D();
533 MITK_TEST_CONDITION(
mitk::Equal(affineTransform3D->GetOffset(), affineTransform3D_2->GetOffset()),
"Testing affine -> navidata -> affine chain: offset");
534 MITK_TEST_CONDITION(mitk::MatrixEqualElementWise(affineTransform3D->GetMatrix(), affineTransform3D_2->GetMatrix()),
"Testing affine -> navidata -> affine chain: rotation");
538static void TestCompose(
bool pre =
false)
540 SetupNaviDataTests();
541 mitk::NavigationData::Pointer nd = CreateNavidata(quaternion, offsetPoint);
542 mitk::AffineTransform3D::Pointer at = CreateAffineTransform(rotation, offsetVector);
544 mitk::NavigationData::Pointer nd2 = CreateNavidata(quaternion2, offsetPoint2);
545 mitk::AffineTransform3D::Pointer at2 = CreateAffineTransform(rotation2, offsetVector2);
547 mitk::Point3D point2 = point;
550 nd->Compose(nd2, pre);
551 point = nd->TransformPoint(point);
553 at->Compose(at2, pre);
554 point2 = at->TransformPoint(point2);
556 MITK_TEST_CONDITION(
mitk::Equal(point, point2),
"Compose pre = " << pre <<
": composition works ");
558 bool covarianceValidityReset = !nd->GetHasOrientation() && !nd->GetHasPosition();
560 MITK_TEST_CONDITION(covarianceValidityReset,
"Compose pre = " << pre <<
": covariance validities reset because not implemented yet.");
563static void TestReverseCompose()
571static void TestClone()
573 SetupNaviDataTests();
574 mitk::NavigationData::Pointer nd = CreateNavidata(quaternion, offsetPoint);
575 mitk::NavigationData::Pointer myClone = nd->Clone();
576 MITK_TEST_CONDITION(
mitk::Equal(*nd,*myClone,mitk::eps,
true),
"Test if clone is equal to original object.");
579 mitk::Point3D myPoint;
580 mitk::FillVector3D(myPoint,121,32132,433);
581 myClone->SetPosition(myPoint);
582 MITK_TEST_CONDITION(!
mitk::Equal(*nd,*myClone),
"Test if clone could be modified without changing the original object.");
593 MITK_TEST_BEGIN(
"NavigationData");
601 TestAffineConstructor();
602 TestAffineConstructorErrorDeterminantNonEqualOne();
603 TestAffineConstructorErrorTransposedNotInverse();
604 TestAffineConstructorErrorCheckingFalse();
607 TestAffineToNaviDataToAffine();
616 TestReverseCompose();
itk::Matrix< mitk::ScalarType, 6, 6 > CovarianceMatrixType
type that holds the error characterization of the position and orientation measurements
mitk::Quaternion OrientationType
Type that holds the orientation part of the tracking data.
double TimeStampType
type that holds the time at which the data was recorded in milliseconds
mitk::Point3D PositionType
Type that holds the position part of the tracking data.
int mitkNavigationDataTest(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.