如何用vtk同时画多条线

how to draw multiple lines simultaneously with vtk?

本文关键字:何用 vtk      更新时间:2023-10-16

目标是从多个点划线我有两个向量tab_recupere_P1和tab_recubere_P2,每个向量的大小是14。我浏览了两个向量,每次迭代都会得到PP1和PP2点来构建一条线。

我使用了几种方法,但都给出了相同的结果

这是我的代码:方法1:

for ( std::vector<Coord_point*>::iterator i = tab_recupere_P1.begin();
                       i != tab_recupere_P1.end();
                       ++i)
{   
   new_p = *i;
   pp1[0] = new_p->p0[0];
   pp1[1] = new_p->p0[1];
   pp1[2] = new_p->p0[2];
   std::cout << " x : "<< pp1[0] << " y : " << pp1[1] << " z : " << pp1[2]  <<std::endl;
   for ( std::vector<Coord_point*>::iterator j = tab_recupere_P2.begin();
                       j != tab_recupere_P2.end();
                       j++)
   {    
    new_p2 = *j;
   pp2[0] = new_p2->p0[0];
   pp2[1] = new_p2->p0[1];
   pp2[2] = new_p2->p0[2];
   std::cout << " x2 : "<< pp2[0] << " y2 : " << pp2[1] << " z2 : " << pp2[2] <<std::endl;

   // Add the two poitns to a vtkPoints object
  vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
  pts->InsertNextPoint(pp1);
  pts->InsertNextPoint(pp2);
 // Create a line between the two points
 vtkSmartPointer<vtkLine> line = 
 vtkSmartPointer<vtkLine>::New();
 for(unsigned int h = 0; h < 2; h++)
 {
line->GetPointIds()->SetId(h,h);
}
// Create a cell array to store the line in
vtkSmartPointer<vtkCellArray> lines = 
vtkSmartPointer<vtkCellArray>::New();
lines->InsertNextCell(line);
// Create a polydata to store everything in
vtkSmartPointer<vtkPolyData> pdata = 
vtkSmartPointer<vtkPolyData>::New();
 // Add the points to the dataset
 pdata->SetPoints(pts);
 // Add the lines to the dataset
 pdata->SetLines(lines);
  #if VTK_MAJOR_VERSION <= 5
  mapper->SetInput(pdata);
  #else
  mapper->SetInputData(pdata);
  #endif
  actor->SetMapper(mapper);
 vtkSmartPointer<vtkRenderer> renderer = 
 vtkSmartPointer<vtkRenderer>::New();
 vtkSmartPointer<vtkRenderWindow> renderWindow = 
 vtkSmartPointer<vtkRenderWindow>::New();
 renderWindow->AddRenderer(renderer);
 renderWindowInteractorLine->SetRenderWindow(renderWindow);
 renderer->AddActor(actor);
 ui.qvtkWidget_Visualisation->SetRenderWindow(renderWindow); 
 ui.qvtkWidget_Visualisation->update(); 
 renderWindowInteractorLine->Initialize();

 renderWindowInteractorLine->Start();
 break;
 }
}

方法编号2:我把线存储在一个向量中,然后我可以画出每条线的

for ( std::vector<Coord_point*>::iterator i = tab_recupere_P1.begin();
                       i != tab_recupere_P1.end();
                       ++i)
{   
   new_p = *i;
   pp1[0] = new_p->p0[0];
   pp1[1] = new_p->p0[1];
   pp1[2] = new_p->p0[2];
   std::cout << " x : "<< pp1[0] << " y : " << pp1[1] << " z : " << pp1[2]  <<std::endl;
   for ( std::vector<Coord_point*>::iterator j = tab_recupere_P2.begin();
                       j != tab_recupere_P2.end();
                       j++)
 {  
    new_p2 = *j;
   pp2[0] = new_p2->p0[0];
   pp2[1] = new_p2->p0[1];
   pp2[2] = new_p2->p0[2];
   std::cout << " x2 : "<< pp2[0] << " y2 : " << pp2[1] << " z2 : " << pp2[2] <<std::endl;
vtkSmartPointer<vtkLineSource> lineSource = 
vtkSmartPointer<vtkLineSource>::New();
 lineSource->SetPoint1(pp1);
 lineSource->SetPoint2(pp2);
 lineSource->Update();
 tab_lineSource.push_back(lineSource);

 break;
  }
 }
vtkSmartPointer<vtkLineSource> new_lineSource = 
vtkSmartPointer<vtkLineSource>::New();
for ( std::vector<vtkLineSource*>::iterator l = tab_lineSource.begin();
                       l != tab_lineSource.end();
                       l++)
{   
new_lineSource = *l;
 mapper->SetInputConnection(new_lineSource->GetOutputPort());
 actor->SetMapper(mapper);
 actor->GetProperty()->SetLineWidth(1);
 actor->GetProperty()->SetColor(1,0,0);
 vtkSmartPointer<vtkRenderer> renderer = 
 vtkSmartPointer<vtkRenderer>::New();
 vtkSmartPointer<vtkRenderWindow> renderWindow = 
  vtkSmartPointer<vtkRenderWindow>::New();
 renderWindow->AddRenderer(renderer);
 renderWindowInteractorLine->SetRenderWindow(renderWindow);
  renderer->AddActor(actor);
  ui.qvtkWidget_Visualisation->SetRenderWindow(renderWindow); 
 ui.qvtkWidget_Visualisation->updateGeometry(); 
  renderWindowInteractorLine->Initialize();
 renderWindowInteractorLine->Start();
 }

问题是,无论采用何种方法,都会绘制出第一次迭代的线条,并且没有错误消息。但是所需要的是从存储在矢量中的点绘制所有的线。

你能帮帮我吗!!请

这两个例子都有很多错误。

示例1:

  • 你在内环的末端有一个缺口。这将在第一次执行内部循环后终止该循环
  • 您可以为每个循环创建新行、多数据和新的渲染器

示例2:

  • 您在内部循环中再次有一个中断,它将在第一次执行后终止它
  • 同样,在每次循环迭代期间,您都会创建一大堆VTK类(包括一个渲染器和一个渲染窗口),同时您应该在两个循环之前和外部创建它们一次

这个代码还有很多错误。你应该从一个简单得多的例子开始。也可以尝试缩进代码,这样读(对你来说)真的很难。