VTK- vtkStripper

前言:本博文主要研究接口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,6

vtkStripper将分散的线连接为折线。

相关代码为:

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();

猜你喜欢

转载自blog.csdn.net/qq_40041064/article/details/129021843