[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