VTK中实现距离测量

    根据http://www.vislab.cn/bbs/viewthread.php?tid=223中提供的代码,实现了其效果。

  
  
  
  
  1. #include "vtkDistanceWidget.h" 
  2. #include "vtkSphereSource.h" 
  3. #include "vtkPolyDataMapper.h" 
  4. #include "vtkActor.h" 
  5. #include "vtkRenderer.h" 
  6. #include "vtkRenderWindow.h" 
  7. #include "vtkRenderWindowInteractor.h" 
  8. #include "vtkCommand.h" 
  9. #include "vtkInteractorEventRecorder.h" 
  10. #include "vtkRegressionTestImage.h" 
  11. #include "vtkDebugLeaks.h" 
  12. #include "vtkCoordinate.h" 
  13. #include "vtkMath.h" 
  14. #include "vtkHandleWidget.h" 
  15. #include "vtkPointHandleRepresentation2D.h" 
  16. #include "vtkAxisActor2D.h" 
  17. #include "vtkProperty2D.h" 
  18. #include "vtkDistanceRepresentation2D.h" 
  19. /////////////////////// 
  20. #include "vtkTIFFReader.h" 
  21. #include "vtkImageDataGeometryFilter.h" 
  22.  
  23. class vtkDistanceCallback : public vtkCommand 
  24. public: 
  25.     static vtkDistanceCallback *New()  
  26.     { return new vtkDistanceCallback; } 
  27.     virtual void Execute(vtkObject *caller, unsigned long, void*); 
  28.     vtkDistanceCallback():Renderer(0),RenderWindow(0),DistanceWidget(0),Distance(0) {} 
  29.     vtkRenderer *Renderer; 
  30.     vtkRenderWindow *RenderWindow; 
  31.     vtkDistanceWidget *DistanceWidget; 
  32.     vtkDistanceRepresentation2D *Distance; 
  33. }; 
  34.  
  35.  
  36. void vtkDistanceCallback::Execute(vtkObject*, unsigned long eid, void* callData) 
  37.     if ( eid == vtkCommand::InteractionEvent || 
  38.         eid == vtkCommand::EndInteractionEvent ) 
  39.     { 
  40.         double pos1[3], pos2[3]; 
  41.         // Modify the measure axis 
  42.         this->Distance->GetPoint1WorldPosition(pos1); 
  43.         this->Distance->GetPoint2WorldPosition(pos2); 
  44.         double dist=sqrt(vtkMath::Distance2BetweenPoints(pos1,pos2)); 
  45.  
  46.         char title[256]="asasa"; 
  47.         this->Distance->GetAxis()->SetRange(0.0,dist); 
  48.         this->Distance->GetAxis()->SetRange(0.0,dist); 
  49.         sprintf(title,"%-#6.3g",dist); 
  50.         this->Distance->GetAxis()->SetTitle(title); 
  51.     } 
  52.     else 
  53.     { 
  54.         int pid = *(reinterpret_cast<int*>(callData)); 
  55.  
  56.         //From the point id, get the display coordinates 
  57.         double pos1[3], pos2[3], *pos; 
  58.         this->Distance->GetPoint1DisplayPosition(pos1); 
  59.         this->Distance->GetPoint2DisplayPosition(pos2); 
  60.         if ( pid == 0 ) 
  61.         { 
  62.             pos = pos1
  63.         } 
  64.         else 
  65.         { 
  66.             pos = pos2
  67.         } 
  68.  
  69.         // Okay, render without the widget, and get the color buffer 
  70.         int enabled = this->DistanceWidget->GetEnabled(); 
  71.         if ( enabled ) 
  72.         { 
  73.             this->DistanceWidget->SetEnabled(0); //does a Render() as a side effect 
  74.         } 
  75.  
  76.         // Pretend we are doing something serious....just randomly bump the 
  77.         // location of the point. 
  78.         double p[3]; 
  79.         p[0] = pos[0] + static_cast<int>(vtkMath::Random(-5.5,5.5)); 
  80.         p[1] = pos[1] + static_cast<int>(vtkMath::Random(-5.5,5.5)); 
  81.         p[2] = 0.0; 
  82.  
  83.         // Set the new position 
  84.         if ( pid == 0 ) 
  85.         { 
  86.             this->Distance->SetPoint1DisplayPosition(p); 
  87.         } 
  88.         else 
  89.         { 
  90.             this->Distance->SetPoint2DisplayPosition(p); 
  91.         } 
  92.  
  93.         // Side effect of a render here 
  94.         if ( enabled ) 
  95.         { 
  96.             this->DistanceWidget->SetEnabled(1); 
  97.         } 
  98.     } 
  99.  
  100. int main(int argc, char *argv[] ) 
  101. {// Create the RenderWindow, Renderer and both Actors 
  102.     // 
  103.     vtkRenderer *ren1 = vtkRenderer::New(); 
  104.     vtkRenderWindow *renWin = vtkRenderWindow::New(); 
  105.     renWin->AddRenderer(ren1); 
  106.  
  107.     vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New(); 
  108.     iren->SetRenderWindow(renWin); 
  109.  
  110.     // Create a test pipeline 
  111.     // 
  112.     vtkSphereSource *ss = vtkSphereSource::New(); 
  113.     vtkPolyDataMapper *mapper = vtkPolyDataMapper::New(); 
  114.     mapper->SetInput(ss->GetOutput()); 
  115.     vtkActor *actor = vtkActor::New(); 
  116.     actor->SetMapper(mapper); 
  117.  
  118.     // Create the widget and its representation 
  119.     vtkPointHandleRepresentation2D *handle = vtkPointHandleRepresentation2D::New(); 
  120.     handle->GetProperty()->SetColor(1,0,0); 
  121.     vtkDistanceRepresentation2D *rep = vtkDistanceRepresentation2D::New(); 
  122.     rep->SetHandleRepresentation(handle); 
  123.  
  124.     // rep->GetAxis()->SetNumberOfMinorTicks(4); 
  125.     rep->GetAxis()->SetTickLength(9); 
  126.     //rep->GetAxis()->SetTitlePosition(0.2); 
  127.  
  128.  
  129.     vtkDistanceWidget *widget = vtkDistanceWidget::New(); 
  130.     widget->SetInteractor(iren); 
  131.  
  132.     widget->SetRepresentation(rep); 
  133.  
  134.     vtkDistanceCallback *mcbk = vtkDistanceCallback::New(); 
  135.     mcbk->Renderer = ren1
  136.     mcbk->RenderWindow = renWin
  137.     mcbk->Distance = rep
  138.     mcbk->DistanceWidget = widget
  139.  
  140.     // Add the actors to the renderer, set the background and size 
  141.     // 
  142.     ren1->AddActor(actor); 
  143.     ren1->SetBackground(0.1, 0.2, 0.4); 
  144.     renWin->SetSize(300, 300); 
  145.  
  146.     // record events 
  147.     /////////////////////////////////// 
  148.     vtkInteractorEventRecorder *recorder = vtkInteractorEventRecorder::New(); 
  149.     recorder->SetInteractor(iren); 
  150.  
  151.     recorder->SetFileName("c:/record.log"); 
  152.     // render the image 
  153.     iren->Initialize(); 
  154.     widget->On(); 
  155.     iren->Start(); 
  156.     widget->On(); 
  157.     ///std::cout<<"asasas"<<std::endl
  158.     /// renWin->Render(); 
  159.     std::cout<<"asasas"<<std::endl
  160.     //widget->On(); 
  161.  
  162.     /////// recorder->Play(); 
  163.  
  164.     // Remove the observers so we can go interactive. Without this the "-I" 
  165.     // testing option fails. 
  166.     ////////////////// recorder->Off(); 
  167.  
  168.     int retVal = vtkRegressionTestImage( renWin ); 
  169.     if ( retVal == vtkRegressionTester::DO_INTERACTOR) 
  170.     { 
  171.         iren->Start(); 
  172.     } 
  173.     ss->Delete(); 
  174.     mapper->Delete(); 
  175.     actor->Delete(); 
  176.     handle->Delete(); 
  177.     rep->Delete(); 
  178.     widget->RemoveObserver(mcbk); 
  179.     mcbk->Delete(); 

程序运行截图: 

 

 

 

 

 

你可能感兴趣的:(VTK,距离测量)