[vtkusers] Missing Neighbors in VTKPolyData

Martin Klemm martin.klemm at hs-offenburg.de
Mon Dec 2 02:33:20 EST 2013


Hi,

I am currently working on a function that passes through all cells of a 
triangulated power crust surface. Depending on the normal of the cell it 
is classified as valid or invalid. The algorithm works except of a 
problem that occurs in certain cells.

For my algorithm I use GetCellEdgeNeighbors of vtkPolyData to receive 
the edge neighbors of a cell. On a closed surface there should be three 
neighbors for a triangle. However, some triangles just have two neighbors.

Then I checked the point neighbors which shows the same result. There 
are no coincident neighbors on this "weird" edge.

Then I rendered the neighbors and the current cell as you can see here:

http://www.picamatic.com/view/9881191_Unbenannt/

Moreover I print the point neighbors:
curCell = 719
point neighbors first point: 719 1151 1153
point neighbors second point: 714 715 719 721 722 7
point neighbors third point: 719 720 721 1151 1152

It looks like that even there are neighbors they are not linked to each 
other. And it seems like there are more neighbors than the renderwindow 
really shows. Could that be because there are really small triangles 
that you cannot really see in the renderer? Do you have any suggestions 
how to improve this situation?

And here is my function to get the neighbors of a specified cell:


/**
  * \brief Gets the neighbors of a specified cell (triangle)
  * \param inputTriangles The input cells (triangles)
  * \param cellId The specified ID of the cell
  * \param neighbors A list with the neighbors of the specified cell
  *
  * \warning You have to call vtkTriangleFilter before using this function.
  * \todo Figure out how it is possible that on a closed surface a 
triangle can have less than three
  * neighbors.
  */
void SurfaceReconstructScreen::GetCellNeighbors(vtkPolyData* inputTriangles,
                                                 vtkIdType cellId,
                                                 QList<vtkIdType>& 
neighbors,
                                                 bool debug)
{
    //clear result list
    neighbors.clear();

    //build links in order to use getcellneighbors
    inputTriangles->BuildLinks();

    //
    vtkSmartPointer<vtkIdList> cellPointIds = 
vtkSmartPointer<vtkIdList>::New();
    inputTriangles->GetCellPoints(cellId, cellPointIds);

    for(vtkIdType i = 0; i < cellPointIds->GetNumberOfIds(); i++)
    {
       vtkSmartPointer<vtkIdList> idList = 
vtkSmartPointer<vtkIdList>::New();
       vtkIdType firstPoint;
       vtkIdType secondPoint;

       //add one of the edge points
       firstPoint = cellPointIds->GetId(i);

       //add the other edge point
       if(i+1 == cellPointIds->GetNumberOfIds())
       {
          secondPoint = cellPointIds->GetId(0);
       }
       else
       {
          secondPoint = cellPointIds->GetId(i + 1);
       }

       //get the neighbors of the cell
       vtkSmartPointer<vtkIdList> neighborCellIds = 
vtkSmartPointer<vtkIdList>::New();

       inputTriangles->GetCellEdgeNeighbors(cellId, firstPoint, 
secondPoint, neighborCellIds);

       for(vtkIdType j = 0; j < neighborCellIds->GetNumberOfIds(); j++)
       {
          neighbors.push_back(neighborCellIds->GetId(j));
       }
    }
}




More information about the vtkusers mailing list