]> Creatis software - clitk.git/blobdiff - vv/vvSlicer.cxx
Corrected LocalWindowing: now really in screen (view) coordinates
[clitk.git] / vv / vvSlicer.cxx
index 60ff1e4ebf594bfb7edae79d88ce2cb210abdcff..03ecaaaff126bcf49f27ddb5643c3b4b6d470e0a 100644 (file)
@@ -68,8 +68,8 @@
 #include <vtkExtractVOI.h>
 #include <vtkSphereSource.h>
 #include <vtkCutter.h>
-#include <vtkPlane.h>
 #include <vtkAssignAttribute.h>
+#include <vtkImageAccumulate.h>
 
 vtkCxxRevisionMacro(vvSlicer, "DummyRevision");
 vtkStandardNewMacro(vvSlicer);
@@ -98,6 +98,7 @@ vvSlicer::vvSlicer()
   text += "F5 = horizontal flip; F6 = vertical flip\n\n";
   text += "0,1,2,3,4,5 : preset windowing\n";
   text += "6,7,8,9 : preset colormap\n";
+  text += "z : local windowing\n";
   text += "r : reset view\n";
   text += "l : reload image\n";
   text += "f : fly to mouse position\n";
@@ -1140,6 +1141,56 @@ void vvSlicer::SetColorLevel(double level)
 }
 //----------------------------------------------------------------------------
 
+//----------------------------------------------------------------------------
+// Returns the min an the max value in a 41x41 region around the mouse pointer
+void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max)
+{
+    //Get mouse pointer position in view coordinates
+    double fLocalExtents[6];
+    for(int i=0; i<3; i++)
+    {
+        fLocalExtents[i*2  ] = mCurrent[i];
+        fLocalExtents[i*2+1] = 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]);
+
+    //Convert to image pixel coordinates (rounded)
+    int iLocalExtents[6];
+    for(int i=0; i<3; i++)
+    {
+        fLocalExtents[i*2  ] = (fLocalExtents[i*2  ] - this->GetInput()->GetOrigin()[i])/this->GetInput()->GetSpacing()[i];
+        fLocalExtents[i*2+1] = (fLocalExtents[i*2+1] - this->GetInput()->GetOrigin()[i])/this->GetInput()->GetSpacing()[i];
+    
+        iLocalExtents[i*2  ] = lrint(fLocalExtents[i*2  ]);
+        iLocalExtents[i*2+1] = lrint(fLocalExtents[i*2+1]);
+
+        if(iLocalExtents[i*2  ]>iLocalExtents[i*2+1])
+            std::swap(iLocalExtents[i*2], iLocalExtents[i*2+1]);
+    }
+    
+    vtkSmartPointer<vtkExtractVOI> voiFilter = vtkExtractVOI::New();
+    voiFilter->SetInput(this->GetInput());
+    voiFilter->SetVOI(iLocalExtents);
+
+    vtkSmartPointer<vtkImageAccumulate> accFilter = vtkImageAccumulate::New();
+    accFilter->SetInput(voiFilter->GetOutput());
+    accFilter->Update();
+   
+    min = *(accFilter->GetMin());
+    max = *(accFilter->GetMax());
+}
+//----------------------------------------------------------------------------
 
 //----------------------------------------------------------------------------
 void vvSlicer::Render()