]> Creatis software - clitk.git/commitdiff
Try to debug RTStruct with rotation matrix
authortbaudier <thomas.baudier@creatis.insa-lyon.fr>
Wed, 4 Oct 2017 08:07:33 +0000 (10:07 +0200)
committertbaudier <thomas.baudier@creatis.insa-lyon.fr>
Wed, 4 Oct 2017 08:07:33 +0000 (10:07 +0200)
Work for clitkDicomRTStruct2ImageFilter not for vv

common/clitkDicomRTStruct2ImageFilter.cxx
common/clitkDicomRTStruct2ImageFilter.h
common/vvImage.cxx
common/vvImage.h

index fcc9e2be26da9c02cfdcb1a94f10e5ff67874745..bf515a423b460ec958a6dd624bea7587103212c2 100644 (file)
@@ -102,10 +102,14 @@ void clitk::DicomRTStruct2ImageFilter::SetImage(vvImage::Pointer image)
   mSpacing.resize(3);
   mOrigin.resize(3);
   mSize.resize(3);
+  mDirection.resize(3);
   for(unsigned int i=0; i<3; i++) {
     mSpacing[i] = image->GetSpacing()[i];
     mOrigin[i] = image->GetOrigin()[i];
     mSize[i] = image->GetSize()[i];
+    mDirection[i].resize(3);
+    for(unsigned int j=0; j<3; j++)
+      mDirection[i][j] = image->GetDirection()[i][j];
   }
 }
 //--------------------------------------------------------------------
@@ -125,10 +129,14 @@ void clitk::DicomRTStruct2ImageFilter::SetImageFilename(std::string f)
   mSpacing.resize(3);
   mOrigin.resize(3);
   mSize.resize(3);
+  mDirection.resize(3);
   for(unsigned int i=0; i<3; i++) {
     mSpacing[i] = header->GetSpacing(i);
     mOrigin[i] = header->GetOrigin(i);
     mSize[i] = header->GetDimensions(i);
+    mDirection[i].resize(3);
+    for(unsigned int j=0; j<3; j++)
+      mDirection[i][j] = header->GetDirection(i)[j];
   }
 }
 //--------------------------------------------------------------------
@@ -176,6 +184,38 @@ void clitk::DicomRTStruct2ImageFilter::Update()
   // Get bounds
   double *bounds=mesh->GetBounds();
 
+  //Change mOrigin, mSize and mSpacing with respect to the directions
+  // Spacing is influenced by input direction
+  std::vector<double> tempSpacing;
+  tempSpacing.resize(3);
+  for(int i=0; i<3; i++) {
+    tempSpacing[i] = 0.0;
+    for(int j=0; j<3; j++) {
+      tempSpacing[i] += mDirection[i][j] * mSpacing[j];
+    }
+  }
+  for(int i=0; i<3; i++)
+    mSpacing[i] = tempSpacing[i];
+
+  // Size is influenced by affine transform matrix and input direction
+  // Size is converted to double, transformed and converted back to size type.
+  std::vector<double> tempSize;
+  tempSize.resize(3);
+  for(int i=0; i<3; i++) {
+    tempSize[i] = 0.0;
+    for(int j=0; j<3; j++) {
+      tempSize[i] += mDirection[i][j] * mSize[j];
+    }
+  }
+  for(int i=0; i<3; i++) {
+    if (tempSize[i] < 0.0) {
+      tempSize[i] *= -1;
+      mOrigin[i] += mSpacing[i]*(tempSize[i] -1);
+      mSpacing[i] *= -1;
+    }
+    mSize[i] = lrint(tempSize[i]);
+  }
+
   // Compute origin
   std::vector<double> origin;
   origin.resize(3);
index 0df00dd46fcfca8a0bf86647487b26156b462eaf..4943818092d4c5b481cc89fae5e16cdd1c6d951f 100644 (file)
@@ -57,6 +57,7 @@ namespace clitk {
     std::vector<double> mSpacing;
     std::vector<double> mOrigin;
     std::vector<unsigned long> mSize;
+    std::vector< std::vector< double> > mDirection;
     clitk::DicomRT_ROI * mROI;
     vtkSmartPointer<vtkImageData> mBinaryImage;
   };
index c7e13cc60b12fe9b98193efb232c8b1792802371..9bed494922a99f3c285e37b0aada061676255d4f 100644 (file)
@@ -261,6 +261,38 @@ const std::vector< vtkSmartPointer<vtkTransform> >& vvImage::GetTransform()
 //--------------------------------------------------------------------
 
 
+//--------------------------------------------------------------------
+std::vector< std::vector<double> > vvImage::GetDirection()
+{
+  int dim = this->GetNumberOfDimensions();
+  vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
+  transform->Identity();
+  for (int i = 0; i < mTransform.size(); i++)
+    transform->Concatenate(this->mTransform[i]);
+
+  vtkSmartPointer<vtkMatrix4x4> matrix = transform->GetMatrix();
+  matrix->Invert();
+  std::vector<std::vector<double> > direction0;
+  for (int i = 0; i < dim; i++) {
+    if (i != 3) {
+      std::vector<double> direction1;
+      for (int j = 0; j < dim; j++) {
+        if (j != 3)
+#if VTK_MAJOR_VERSION <= 6
+          direction1.push_back((*matrix)[i][j]);
+#else
+          direction1.push_back((*matrix).GetElement(i,j))
+#endif
+      }
+      direction0.push_back(direction1);
+    }
+  }
+  return direction0;
+}
+//--------------------------------------------------------------------
+
+
+
 //--------------------------------------------------------------------
 bool vvImage::HaveSameSizeAndSpacingThan(vvImage * other)
 {
index d18ee9865303e217099ba4c40b5247c437ed66e7..09cb4d94bcd7bb4d58b8378a8fb3430efc2112fa 100644 (file)
@@ -60,6 +60,7 @@ public :
   std::vector<double> GetSpacing();
   std::vector<double> GetOrigin() const;
   std::vector<int> GetSize();
+  std::vector< std::vector<double> > GetDirection();
   std::string GetScalarTypeAsITKString();
   int GetNumberOfScalarComponents();
   int GetScalarSize();