[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