]> Creatis software - clitk.git/commitdiff
Fix local windowing: was not accounting for SliceOrientation and transforms
authorSimon Rit <simon.rit@creatis.insa-lyon.fr>
Wed, 25 Apr 2012 11:26:13 +0000 (13:26 +0200)
committerSimon Rit <simon.rit@creatis.insa-lyon.fr>
Wed, 25 Apr 2012 11:26:13 +0000 (13:26 +0200)
vv/vvSlicer.cxx
vv/vvSlicer.h
vv/vvSlicerManager.cxx

index 5f86337f0238f96f725e1405b83ad6eb6c84eacf..2224a9ac9748dd6abb32b09a79185048f93137fc 100644 (file)
@@ -1168,33 +1168,38 @@ void vvSlicer::SetOverlayColorLevel(double level)
 
 //----------------------------------------------------------------------------
 // Returns the min an the max value in a 41x41 region around the mouse pointer
-void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max, vtkImageData *image)
+void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max, vtkImageData *image, vtkTransform *transform)
 {
   //Get mouse pointer position in view coordinates
-  double fLocalExtents[6];
+  double corner1[3];
+  double corner2[3];
   for(int i=0; i<3; i++) {
-    fLocalExtents[i*2  ] = mCurrent[i];
-    fLocalExtents[i*2+1] = mCurrent[i];
+    corner1[i] = mCurrent[i];
+    corner2[i] = mCurrent[i];
   }
-  this->Renderer->WorldToView(fLocalExtents[0], fLocalExtents[2], fLocalExtents[4]);
-  this->Renderer->WorldToView(fLocalExtents[1], fLocalExtents[3], fLocalExtents[5]);
-  for(int i=0; i<3; i++) {
-    if (i!=SliceOrientation) { //SR: assumes that SliceOrientation is valid in ViewCoordinates (???)
-      fLocalExtents[i*2  ] -= 0.2;
-      fLocalExtents[i*2+1] += 0.2;
-    }
-  }
-  this->Renderer->ViewToWorld(fLocalExtents[0], fLocalExtents[2], fLocalExtents[4]);
-  this->Renderer->ViewToWorld(fLocalExtents[1], fLocalExtents[3], fLocalExtents[5]);
+  this->Renderer->WorldToView(corner1[0], corner1[1], corner1[2]);
+  this->Renderer->WorldToView(corner2[0], corner2[1], corner2[2]);
+
+  // In view coordinates, x is the slicer width and y is the slicer height are the in-plane axis
+  int w, h;
+  this->Renderer->GetTiledSize(&w, &h);
+  corner1[0] -= 0.2*h/(double)w;
+  corner2[0] += 0.2*h/(double)w;
+  corner1[1] -= 0.2;
+  corner2[1] += 0.2;
+  this->Renderer->ViewToWorld(corner1[0], corner1[1], corner1[2]);
+  this->Renderer->ViewToWorld(corner2[0], corner2[1], corner2[2]);
 
   //Convert to image pixel coordinates (rounded)
+  transform->TransformPoint(corner1, corner1);
+  transform->TransformPoint(corner2, corner2);
   int iLocalExtents[6];
   for(int i=0; i<3; i++) {
-    fLocalExtents[i*2  ] = (fLocalExtents[i*2  ] - image->GetOrigin()[i])/image->GetSpacing()[i];
-    fLocalExtents[i*2+1] = (fLocalExtents[i*2+1] - image->GetOrigin()[i])/image->GetSpacing()[i];
+    corner1[i] = (corner1[i] - image->GetOrigin()[i])/image->GetSpacing()[i];
+    corner2[i] = (corner2[i] - image->GetOrigin()[i])/image->GetSpacing()[i];
 
-    iLocalExtents[i*2  ] = lrint(fLocalExtents[i*2  ]);
-    iLocalExtents[i*2+1] = lrint(fLocalExtents[i*2+1]);
+    iLocalExtents[i*2  ] = lrint(corner1[i]);
+    iLocalExtents[i*2+1] = lrint(corner2[i]);
 
     if(iLocalExtents[i*2  ]>iLocalExtents[i*2+1])
       std::swap(iLocalExtents[i*2], iLocalExtents[i*2+1]);
index b9cc334047acbd6d74e82da91d9714ef7cbbb6cc..c09001dcb38e90d66080459f0152d4ea77c80e28 100644 (file)
@@ -154,7 +154,7 @@ public:
   void SetCornerAnnotationVisibility(bool s);
   bool GetCornerAnnotationVisibility();
 
-  void GetExtremasAroundMousePointer(double & min, double & max, vtkImageData *image);
+  void GetExtremasAroundMousePointer(double & min, double & max, vtkImageData *image, vtkTransform *transform);
 
   void UpdateLandmarks();
   void ForceUpdateDisplayExtent();
index a787370e70629b8d1ec3814ff02b8d9970fad6bc..3f6f9139fc2e1bec9540eb3480dc49c52b2fdc34 100644 (file)
@@ -1117,13 +1117,17 @@ void vvSlicerManager::SetLocalColorWindowing(const int slicer, const bool bCtrlK
   double min, max;
   int t = this->mSlicers[slicer]->GetTSlice();
   if(bCtrlKey && this->mSlicers[slicer]->GetFusion()) {
-    this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max, this->mSlicers[slicer]->GetFusion()->GetVTKImages()[t]);
+    this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,
+                                                          this->mSlicers[slicer]->GetFusion()->GetVTKImages()[t],
+                                                          this->mSlicers[slicer]->GetFusion()->GetTransform());
     this->SetFusionWindow(max-min);
     this->SetFusionLevel(0.5*(min+max));
     this->SetColorMap(mColorMap);
   }
   else if(bCtrlKey && this->mSlicers[slicer]->GetOverlay()) {
-    this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max, this->mSlicers[slicer]->GetOverlay()->GetVTKImages()[t]);
+    this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,
+                                                          this->mSlicers[slicer]->GetOverlay()->GetVTKImages()[t],
+                                                          this->mSlicers[slicer]->GetOverlay()->GetTransform());
     if(this->mSlicers[slicer]->GetLinkOverlayWindowLevel()){
       this->SetColorWindow(max-min);
       this->SetColorLevel(0.5*(min+max));
@@ -1133,7 +1137,9 @@ void vvSlicerManager::SetLocalColorWindowing(const int slicer, const bool bCtrlK
     }
   }
   else {
-    this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max, this->mSlicers[slicer]->GetInput());
+    this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,
+                                                          this->mSlicers[slicer]->GetImage()->GetVTKImages()[t],
+                                                          this->mSlicers[slicer]->GetImage()->GetTransform());
     this->SetColorWindow(max-min);
     this->SetColorLevel(0.5*(min+max));
     this->SetPreset(6);