[vtkusers] Missing Neighbors in VTKPolyData

Bill Lorensen bill.lorensen at gmail.com
Mon Dec 2 10:36:04 EST 2013


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
>>
>>
>>
>>
>



-- 
Unpaid intern in BillsBasement at noware dot com


More information about the vtkusers mailing list