如何直接访问VTK中的多边形?

时间:2018-07-28 06:18:32

标签: vtk

当我无法直接访问vtkPolyData中的特定单元格时,我发现了this post online(可追溯到2013年)。我正在使用最新版本:VTK 8.1.1,似乎新版本的VTK仍然存在此问题。

polys->InitTraversal();
for(int i = 0; i < polys->GetNumberOfCells(); i++)
{
    polys->GetNextCell(idList); // This sequential method gets the point IDs correctly
    int a = idList->GetId(0);
    int b = idList->GetId(1);
    int c = idList->GetId(2);
}

但是,直接访问方法似乎有问题

polys->InitTraversal();
for(int i = 0; i < polys->GetNumberOfCells(); i++)
{
    polys->GetCell(i, idList);    // This method returns wrong ids
    int a = idList->GetId(0);
    int b = idList->GetId(1);
    int c = idList->GetId(2);
}

如何在不遍历所有单元的情况下获取特定单元中的点ID? polys->GetCell(i, idList)并非旨在让您直接访问特定单元格吗?

1 个答案:

答案 0 :(得分:1)

对于直接访问,我们可以使用vtkPolyData::GetCellPoints()方法。例如我们可以做

vtkNew<vtkIdList> idL; // or auto idL = vtkSmartPointer<vtkIdList>::New();
poly->GetCellPoints( 13, idL ); // Assuming you want the points for 13th cell
for(auto i = 0; i < idL->GetNumberOfIds(); ++i)
    std::cout<< idL->GetId(i) << std::endl;

对于循环遍历所有单元格,我更喜欢使用while循环:

vtkNew<vtkIdList> idL;
poly->GetPolys()->InitTraversal();
while(poly->GetPolys()->GetNextCell(idL)){
    for(auto i = 0; i < idL->GetNumberOfIds(); ++i)
        std::cout<< idL->GetId(i) << std::endl;
}