0

目标是从几个点画线我有 2 个向量 tab_recupere_P1 和 tab_recupere_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();
 }

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

你能帮帮我吗!!拜托!!

4

1 回答 1

0

这两个例子都有很多问题。

在示例 1 中:

  • 在内循环的末尾有一个休息时间。这将在第一次执行后终止内部循环。
  • 您在每个循环中创建新的线条、多边形数据和新的渲染器!

在示例 2 中:

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

这段代码还有很多错误。你应该从一个更简单的例子开始。还可以尝试缩进您的代码,这种方式很难阅读(对您来说也是如此)。

于 2013-06-23T13:24:06.303 回答