前言:本博文主要研究接口vtkStripper的实现原理及主要的应用场景,希望对各位小伙伴有所帮助。
描述:vtkStripper是一个过滤器,用于从输入多边形、三角形带和线中生成三角形带和/或折线。输入多边形仅当它们是三角形时才被组装成三角形条;其他类型的多边形被传递到输出,而不是剥离。(如果需要剥离所有数据,在运行此过滤器之前使用vtkTriangleFilter对非三角形多边形进行三角化。)如果顶点出现在输入polydata中,过滤器将通过(到输出)顶点。还要注意,如果在输入中定义了三角形条或折线,它们将被传递,而不是连接或扩展。(如果你希望剥离这些,在运行vtkStripper之前,使用vtkTriangleFilter将输入分割成三角形和行。)
变量MaximumLength可以用来控制三角形带和折线的最大允许长度。
默认情况下,此筛选器会丢弃与输入相关的任何单元格数据。
这是因为单元格结构发生了变化,并且旧的单元格数据不再有效。当设置了PassCellDataAsFieldData标志时,单元格数据将通过以下规则作为FieldData传递到输出:
1)对于输出中每个不是三角形带的单元格,在输出字段数据中每个单元格插入一次单元格数据。
2)对于输出中的每个三角形条形单元:
Ii)条带中每个点(j|j>=2)插入1个元组。
这是输入中(j-2, j-1, j)形成的单元格的单元格数据。
字段数据的顺序与单元格数据相同,即(vert,line, polyys,tsrips)。
如果输入数据中存在三角形条或折线,它们将被传递到输出数据。如果三角形多边形可用,这个过滤器只会构造三角形条带;并且只在线可用时构造折线。
实例:
1. 针对PolyData数据,通过 vtkFeatureEdges获取边线,得到edges对应的PolyData数据。
vtkIdType numPts = edges->GetOutput()->GetNumberOfPoints();
vtkIdType numLines = edges->GetOutput()->GetNumberOfLines();
vtkIdType numCells = edges->GetOutput()->GetNumberOfCells();
分别为:526,530,530
2. edges通过Stripper进行整合,得到stripper对应的PolyData数据。
vtkIdType snumPts = stripper->GetOutput()->GetNumberOfPoints();
vtkIdType snumLines = stripper->GetOutput()->GetNumberOfLines();
vtkIdType snumCells = stripper->GetOutput()->GetNumberOfCells();
分别为:526,6,6vtkStripper将分散的线连接为折线。
相关代码为:
vtkFeatureEdges* edges = vtkFeatureEdges::New();
edges->SetInputData(m_selectObject->GetPolyData());
edges->BoundaryEdgesOff();
edges->FeatureEdgesOn();
edges->ManifoldEdgesOff();
edges->NonManifoldEdgesOff();
edges->Update();
if (nullptr == edges->GetOutput())
{
edges->Delete();
edges = nullptr;
return;
}
vtkIdType numPts = edges->GetOutput()->GetNumberOfPoints();
vtkIdType numLines = edges->GetOutput()->GetNumberOfLines();
vtkIdType numCells = edges->GetOutput()->GetNumberOfCells();
vtkStripper* stripper = vtkStripper::New();
stripper->SetInputData(edges->GetOutput());
stripper->Update();
if (nullptr == stripper->GetOutput())
{
edges->Delete();
edges = nullptr;
stripper->Delete();
stripper = nullptr;
return;
}
vtkIdType snumPts = stripper->GetOutput()->GetNumberOfPoints();
vtkIdType snumLines = stripper->GetOutput()->GetNumberOfLines();
vtkIdType snumCells = stripper->GetOutput()->GetNumberOfCells();