2013-06-22 45 views
0

目標是從幾個點畫線 我有2個矢量tab_recupere_P1和tab_recupere_P2,每個矢量的大小是14. 我瀏覽了兩個矢量,我在每次迭代時都會得到PP1和PP2指向的一條線。如何用vtk同時繪製多行?

我用幾種方法但都給出了相同的結果

這裏是我的代碼:方法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; 

} 
} 

方法numbre 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(); 
} 

問題是無論哪種方法,第一次迭代的行將被繪製並且沒有錯誤消息。但需要從矢量中存儲的點中繪製所有線。

請你幫我!!請!

+0

您是否可以在兩種情況下粘貼由於cout語句而看到的輸出? –

+0

另外,在第二個示例中,您將在第一次迭代後終止它的嵌套for循環中斷。這可能不是你的意思。 –

回答

0

這兩個示例都有很多錯誤。

在實施例1:

  • 你必須在內部循環的端部的斷裂。這將在第一次執行後終止內部循環。
  • 您可以在每個循環中創建新行,polydata和新的渲染器!

在示例2:

  • 你再有這回事了第一次執行之後終止它的內部循環,休息。
  • 在每次循環迭代期間,您還要創建一大堆VTK類(包括渲染器和渲染窗口),而您應該在兩個循環之前和之外創建一次。

這段代碼有很多錯誤。你應該從一個更簡單的例子開始。也嘗試縮進你的代碼,這樣很難閱讀(也適合你)。

+0

感謝您的回覆,我改變了方法:我創建了一個名爲Point的類,並將每個實例存儲在一個動態數組中,並且我獲得了成功的值。 – Clara

+0

但我想知道的是,有可能與vtkLineSource同時畫幾條線,如果可能,請給我一個例子,謝謝。 – Clara