[vtkusers] Missing Neighbors in VTKPolyData

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


Thank you. vtkFeatureEdges shows me exactly the edges that return just 2 
neighbors instead of three. But do you know any way to resolve this 
issue? How can I connect this edges with its proper neighbors?

On 02.12.2013 16:36, Bill Lorensen wrote:
> The filter vtkFeatureEdges can detect boundary edges. See this example:
> http://vtk.org/Wiki/VTK/Examples/Cxx/Meshes/BoundaryEdges
>
>
> On Mon, Dec 2, 2013 at 9:12 AM, Martin Klemm
> <martin.klemm at hs-offenburg.de> wrote:
>> The surface was generated by the vtkPowerCrustSurfaceFilter (found here
>> http://www.sq3.org.uk/powercrust/ ). Since I need triangles I used a
>> trianglefilter afterwards. Then I used a vtkFillHolesFilter in case there is
>> a hole (but I think it is not necessary). Then I use two planes to clip away
>> a part of the generated surface. Because vtkClipClosedSurface can produce
>> lines I used another triangle filter to filter out the lines.
>>
>> And the problem happens with the output of the last triangle filter. So my
>> pipeline is as follows:
>> vtkPowerCrustSurfaceFilter -> vtkTriangleFilter -> vtkFillHolesFilter ->
>> vtkClipClosedSurface -> vtkTriangleFilter
>>
>> Do you know how I can check for cracks in the surface? Or is there even a
>> good way to close them?
>>
>> Thanks for your help!
>>
>>
>>
>> On 02.12.2013 14:27, Bill Lorensen wrote:
>>>
>>> How was the surface generated. Perhaps there are cracks in the surface.
>>>
>>>
>>> On Mon, Dec 2, 2013 at 2:33 AM, Martin Klemm
>>> <martin.klemm at hs-offenburg.de> wrote:
>>>>
>>>>
>>>> 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));
>>>>         }
>>>>      }
>>>> }
>>>>
>>>>
>>>> _______________________________________________
>>>> Powered by www.kitware.com
>>>>
>>>> Visit other Kitware open-source projects at
>>>> http://www.kitware.com/opensource/opensource.html
>>>>
>>>> Please keep messages on-topic and check the VTK FAQ at:
>>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>>
>>>> Follow this link to subscribe/unsubscribe:
>>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>
>>>
>>>
>>>
>>
>
>
>

-- 


Martin Klemm
Hochschule Offenburg
Badstraße 24
77652 Offenburg
Tel. +49 781 / 205 - 4681


More information about the vtkusers mailing list