Functions

mitkGeometry3DTest.cpp File Reference

#include "mitkGeometry3D.h"
#include <vnl/vnl_quaternion.h>
#include <vnl/vnl_quaternion.txx>
#include "mitkRotationOperation.h"
#include "mitkInteractionConst.h"
#include <mitkMatrixConvert.h>
#include "mitkTestingMacros.h"
#include <fstream>
#include <itkImage.h>

Go to the source code of this file.

Functions

bool testGetAxisVectorVariants (mitk::Geometry3D *geometry)
bool testGetAxisVectorExtent (mitk::Geometry3D *geometry)
int testIndexAndWorldConsistency (mitk::Geometry3D *geometry3d)
int testItkImageIsCenterBased ()
int testGeometry3D (bool imageGeometry)
int mitkGeometry3DTest (int, char *[])

Function Documentation

int mitkGeometry3DTest ( int  ,
char *  [] 
)

Definition at line 290 of file mitkGeometry3DTest.cpp.

References EXIT_SUCCESS, MITK_TEST_BEGIN, MITK_TEST_CONDITION_REQUIRED, MITK_TEST_END, MITK_TEST_OUTPUT, mitkGeometry3DTest(), testGeometry3D(), and testItkImageIsCenterBased().

Referenced by mitkGeometry3DTest().

{
  MITK_TEST_BEGIN(mitkGeometry3DTest);

  int result;

  MITK_TEST_CONDITION_REQUIRED( (result = testItkImageIsCenterBased()) == EXIT_SUCCESS, "");

  MITK_TEST_OUTPUT(<< "Running main part of test with ImageGeometry = false");
  MITK_TEST_CONDITION_REQUIRED( (result = testGeometry3D(false)) == EXIT_SUCCESS, "");

  MITK_TEST_OUTPUT(<< "Running main part of test with ImageGeometry = true");
  MITK_TEST_CONDITION_REQUIRED( (result = testGeometry3D(true)) == EXIT_SUCCESS, "");

  MITK_TEST_END();

  return EXIT_SUCCESS;
}
int testGeometry3D ( bool  imageGeometry )

Definition at line 188 of file mitkGeometry3DTest.cpp.

References EXIT_FAILURE, EXIT_SUCCESS, mitk::GetRotation(), matrix(), MITK_TEST_CONDITION_REQUIRED, MITK_TEST_OUTPUT, mitk::Geometry3D::New(), mitk::OpROTATE, testGetAxisVectorExtent(), testGetAxisVectorVariants(), and testIndexAndWorldConsistency().

Referenced by mitkGeometry3DTest().

{
  float bounds[ ] = {-10.0, 17.0, -12.0, 188.0, 13.0, 211.0};

  mitk::Geometry3D::Pointer geometry3d = mitk::Geometry3D::New();

  std::cout << "Initializing: ";
  geometry3d->Initialize();
  std::cout<<"[PASSED]"<<std::endl;

  MITK_TEST_OUTPUT(<< "Setting ImageGeometry to " << imageGeometry);
  geometry3d->SetImageGeometry(imageGeometry);
  std::cout<<"[PASSED]"<<std::endl;

  std::cout << "Setting bounds by SetFloatBounds(): ";
  geometry3d->SetFloatBounds(bounds);
  std::cout<<"[PASSED]"<<std::endl;
 
  if(testGetAxisVectorVariants(geometry3d) == false)
    return EXIT_FAILURE;

  if(testGetAxisVectorExtent(geometry3d) == false)
    return EXIT_FAILURE;

  std::cout << "Creating an AffineTransform3D transform: ";
  mitk::AffineTransform3D::MatrixType matrix;
  matrix.SetIdentity();
  matrix(1,1) = 2;
  mitk::AffineTransform3D::Pointer transform;
  transform = mitk::AffineTransform3D::New();
  transform->SetMatrix(matrix);
  std::cout<<"[PASSED]"<<std::endl;

  std::cout << "Testing a SetIndexToWorldTransform: ";
  geometry3d->SetIndexToWorldTransform(transform);
  std::cout<<"[PASSED]"<<std::endl;

  std::cout << "Testing correctness of value returned by GetSpacing: ";
  const mitk::Vector3D& spacing1 = geometry3d->GetSpacing();
  mitk::Vector3D expectedSpacing;
  expectedSpacing.Fill(1.0);
  expectedSpacing[1] = 2;
  if( mitk::Equal(spacing1, expectedSpacing) == false )
  {
      std::cout<<"[FAILED]"<<std::endl;
      return EXIT_FAILURE;
  }
  std::cout<<"[PASSED]"<<std::endl;

  std::cout << "Testing a Compose(transform): ";
  geometry3d->Compose(transform);
  std::cout<<"[PASSED]"<<std::endl;

  std::cout << "Testing correctness of value returned by GetSpacing: ";
  const mitk::Vector3D& spacing2 = geometry3d->GetSpacing();
  expectedSpacing[1] = 4;
  if( mitk::Equal(spacing2, expectedSpacing) == false )
  {
      std::cout<<"[FAILED]"<<std::endl;
      return EXIT_FAILURE;
  }
  std::cout<<"[PASSED]"<<std::endl;

  std::cout << "Testing correctness of SetSpacing: ";
  mitk::Vector3D newspacing;
  mitk::FillVector3D(newspacing, 1.5, 2.5, 3.5);
  geometry3d->SetSpacing(newspacing);
  const mitk::Vector3D& spacing3 = geometry3d->GetSpacing();
  if( mitk::Equal(spacing3, newspacing) == false )
  {
      std::cout<<"[FAILED]"<<std::endl;
      return EXIT_FAILURE;
  }
  std::cout<<"[PASSED]"<<std::endl;

  testIndexAndWorldConsistency(geometry3d);

  std::cout << "Testing a rotation of the geometry: ";
  double angle = 35.0;
  mitk::Vector3D rotationVector; mitk::FillVector3D( rotationVector, 1, 0, 0 );
  mitk::Point3D center = geometry3d->GetCenter();
  mitk::RotationOperation* op = new mitk::RotationOperation( mitk::OpROTATE, center, rotationVector, angle );
  geometry3d->ExecuteOperation(op);

  MITK_TEST_OUTPUT( << " Testing mitk::GetRotation() and success of rotation");
  mitk::Matrix3D rotation;
  mitk::GetRotation(geometry3d, rotation);
  mitk::Vector3D voxelStep=rotation*newspacing;  
  mitk::Vector3D voxelStepIndex;
  geometry3d->WorldToIndex(geometry3d->GetOrigin(), voxelStep, voxelStepIndex);
  mitk::Vector3D expectedVoxelStepIndex;
  expectedVoxelStepIndex.Fill(1);
  MITK_TEST_CONDITION_REQUIRED(mitk::Equal(voxelStepIndex,expectedVoxelStepIndex), "");
  delete op;
  std::cout<<"[PASSED]"<<std::endl;

  MITK_TEST_OUTPUT( << "Testing that ImageGeometry is still " << imageGeometry);
  MITK_TEST_CONDITION_REQUIRED(geometry3d->GetImageGeometry() == imageGeometry, "");

  return EXIT_SUCCESS;
}
bool testGetAxisVectorExtent ( mitk::Geometry3D geometry )

Definition at line 53 of file mitkGeometry3DTest.cpp.

References mitk::Geometry3D::GetAxisVector(), and mitk::Geometry3D::GetExtentInMM().

Referenced by testGeometry3D().

{
  int direction;
  for(direction=0; direction<3; ++direction)
  {
    if(mitk::Equal(geometry->GetAxisVector(direction).GetNorm(), geometry->GetExtentInMM(direction)) == false)
    {
      std::cout<<"[FAILED]"<<std::endl;
      return false;
    }
    std::cout<<"[PASSED]"<<std::endl;
  }
  return true;
}
bool testGetAxisVectorVariants ( mitk::Geometry3D geometry )

Definition at line 30 of file mitkGeometry3DTest.cpp.

References mitk::Geometry3D::GetAxisVector(), and mitk::Geometry3D::GetCornerPoint().

Referenced by testGeometry3D().

{
  int direction;
  for(direction=0; direction<3; ++direction)
  {
    mitk::Vector3D frontToBack;
    switch(direction)
    {
      case 0: frontToBack = geometry->GetCornerPoint(false, false, false)-geometry->GetCornerPoint(true , false, false); break; //7-3
      case 1: frontToBack = geometry->GetCornerPoint(false, false, false)-geometry->GetCornerPoint(false, true , false); break; //7-5
      case 2: frontToBack = geometry->GetCornerPoint(false, false, false)-geometry->GetCornerPoint(false , false, true);  break; //7-2
    }
    std::cout << "Testing GetAxisVector(int) vs GetAxisVector(bool, bool, bool): ";
    if(mitk::Equal(geometry->GetAxisVector(direction), frontToBack) == false)
    {
      std::cout<<"[FAILED]"<<std::endl;
      return false;
    }
    std::cout<<"[PASSED]"<<std::endl;
  }
  return true;
}
int testIndexAndWorldConsistency ( mitk::Geometry3D geometry3d )

Definition at line 69 of file mitkGeometry3DTest.cpp.

References EXIT_SUCCESS, mitk::Geometry3D::GetBoundingBox(), mitk::Geometry3D::GetCenter(), mitk::Geometry3D::GetOrigin(), mitk::Geometry3D::GetSpacing(), mitk::Geometry3D::IndexToWorld(), MITK_TEST_CONDITION_REQUIRED, MITK_TEST_OUTPUT, and mitk::Geometry3D::WorldToIndex().

Referenced by testGeometry3D().

{
  MITK_TEST_OUTPUT( << "Testing consistency of index and world coordinate systems: ");
  mitk::Point3D origin = geometry3d->GetOrigin();
  mitk::Point3D dummy;

  MITK_TEST_OUTPUT( << " Testing index->world->index conversion consistency");
  geometry3d->WorldToIndex(origin, dummy);
  geometry3d->IndexToWorld(dummy, dummy);
  MITK_TEST_CONDITION_REQUIRED(dummy == origin, "");

  MITK_TEST_OUTPUT( << " Testing WorldToIndex(origin, mitk::Point3D)==(0,0,0)");
  mitk::Point3D globalOrigin;
  mitk::FillVector3D(globalOrigin, 0,0,0);
  
  mitk::Point3D originContinuousIndex;
  geometry3d->WorldToIndex(origin, originContinuousIndex);
  MITK_TEST_CONDITION_REQUIRED(originContinuousIndex == globalOrigin, "");

  MITK_TEST_OUTPUT( << " Testing WorldToIndex(origin, itk::Index)==(0,0,0)");
  itk::Index<3> itkindex;
  geometry3d->WorldToIndex(origin, itkindex);
  itk::Index<3> globalOriginIndex;
  mitk::vtk2itk(globalOrigin, globalOriginIndex);
  MITK_TEST_CONDITION_REQUIRED(itkindex == globalOriginIndex, "");

  MITK_TEST_OUTPUT( << " Testing WorldToIndex(origin-0.5*spacing, itk::Index)==(0,0,0)");
  mitk::Vector3D halfSpacingStep = geometry3d->GetSpacing()*0.5;
  mitk::Matrix3D rotation;
  mitk::Point3D originOffCenter = origin-halfSpacingStep;
  geometry3d->WorldToIndex(originOffCenter, itkindex);
  MITK_TEST_CONDITION_REQUIRED(itkindex == globalOriginIndex, "");

  MITK_TEST_OUTPUT( << " Testing WorldToIndex(origin+0.5*spacing-eps, itk::Index)==(0,0,0)");  
  originOffCenter = origin+halfSpacingStep;
  originOffCenter -= 0.0001;
  geometry3d->WorldToIndex( originOffCenter, itkindex);
  MITK_TEST_CONDITION_REQUIRED(itkindex == globalOriginIndex, "");

  MITK_TEST_OUTPUT( << " Testing WorldToIndex(origin+0.5*spacing, itk::Index)==(1,1,1)");
  originOffCenter = origin+halfSpacingStep;
  itk::Index<3> global111;
  mitk::FillVector3D(global111, 1,1,1);
  geometry3d->WorldToIndex( originOffCenter, itkindex);
  MITK_TEST_CONDITION_REQUIRED(itkindex == global111, "");

  MITK_TEST_OUTPUT( << " Testing WorldToIndex(GetCenter())==BoundingBox.GetCenter: ");
  mitk::Point3D center = geometry3d->GetCenter();
  mitk::Point3D centerContIndex;
  geometry3d->WorldToIndex(center, centerContIndex);
  mitk::BoundingBox::ConstPointer boundingBox = geometry3d->GetBoundingBox();
  mitk::BoundingBox::PointType centerBounds = boundingBox->GetCenter();
  MITK_TEST_CONDITION_REQUIRED(mitk::Equal(centerContIndex,centerBounds), "");

  MITK_TEST_OUTPUT( << " Testing GetCenter()==IndexToWorld(BoundingBox.GetCenter): ");
  center = geometry3d->GetCenter();
  mitk::Point3D centerBoundsInWorldCoords;
  geometry3d->IndexToWorld(centerBounds, centerBoundsInWorldCoords);
  MITK_TEST_CONDITION_REQUIRED(mitk::Equal(center,centerBoundsInWorldCoords), "");

  return EXIT_SUCCESS;
}
int testItkImageIsCenterBased (  )

Definition at line 134 of file mitkGeometry3DTest.cpp.

References EXIT_SUCCESS, MITK_TEST_CONDITION_REQUIRED, and MITK_TEST_OUTPUT.

Referenced by mitkGeometry3DTest().

{
  MITK_TEST_OUTPUT(<< "Testing whether itk::Image coordinates are center-based.");
  typedef itk::Image<int,3> ItkIntImage3D;
  ItkIntImage3D::Pointer itkintimage = ItkIntImage3D::New();
  ItkIntImage3D::SizeType size;
  size.Fill(10);
  mitk::Point3D origin;
  mitk::FillVector3D(origin, 2,3,7);
  itkintimage->Initialize();
  itkintimage->SetRegions(size);
  itkintimage->SetOrigin(origin);
  std::cout<<"[PASSED]"<<std::endl;

  MITK_TEST_OUTPUT( << " Testing itk::Image::TransformPhysicalPointToContinuousIndex(origin)==(0,0,0)");
  mitk::Point3D globalOrigin;
  mitk::FillVector3D(globalOrigin, 0,0,0);

  itk::ContinuousIndex<mitk::ScalarType, 3> originContinuousIndex;
  itkintimage->TransformPhysicalPointToContinuousIndex(origin, originContinuousIndex);
  MITK_TEST_CONDITION_REQUIRED(originContinuousIndex == globalOrigin, "");

  MITK_TEST_OUTPUT( << " Testing itk::Image::TransformPhysicalPointToIndex(origin)==(0,0,0)");
  itk::Index<3> itkindex;
  itkintimage->TransformPhysicalPointToIndex(origin, itkindex);
  itk::Index<3> globalOriginIndex;
  mitk::vtk2itk(globalOrigin, globalOriginIndex);
  MITK_TEST_CONDITION_REQUIRED(itkindex == globalOriginIndex, "");

  MITK_TEST_OUTPUT( << " Testing itk::Image::TransformPhysicalPointToIndex(origin-0.5*spacing)==(0,0,0)");
  mitk::Vector3D halfSpacingStep = itkintimage->GetSpacing()*0.5;
  mitk::Matrix3D rotation;
  mitk::Point3D originOffCenter = origin-halfSpacingStep;
  itkintimage->TransformPhysicalPointToIndex(originOffCenter, itkindex);
  MITK_TEST_CONDITION_REQUIRED(itkindex == globalOriginIndex, "");

  MITK_TEST_OUTPUT( << " Testing itk::Image::TransformPhysicalPointToIndex(origin+0.5*spacing-eps, itk::Index)==(0,0,0)");  
  originOffCenter = origin+halfSpacingStep;
  originOffCenter -= 0.0001;
  itkintimage->TransformPhysicalPointToIndex( originOffCenter, itkindex);
  MITK_TEST_CONDITION_REQUIRED(itkindex == globalOriginIndex, "");

  MITK_TEST_OUTPUT( << " Testing itk::Image::TransformPhysicalPointToIndex(origin+0.5*spacing, itk::Index)==(1,1,1)");
  originOffCenter = origin+halfSpacingStep;
  itk::Index<3> global111;
  mitk::FillVector3D(global111, 1,1,1);
  itkintimage->TransformPhysicalPointToIndex( originOffCenter, itkindex);
  MITK_TEST_CONDITION_REQUIRED(itkindex == global111, "");

  MITK_TEST_OUTPUT( << "=> Yes, itk::Image coordinates are center-based.");

  return EXIT_SUCCESS;
}
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines