前言:本博文主要介绍vtkIntersectionPolyDataFilter的功能及实现原理,希望能帮助小伙伴更好的理解该接口。
vtkIntersectionPolyDataFilter
描述:
vtkIntersectionPolyDataFilter计算两个vtkPolyData对象之间的交集。第一各输出是一组Lines,标记输入vtkPolyData对象的交集,并包含五个不同的附加数据数组:SurfaceID, Input0CellID,Input1CellID,NewCell0ID,NewCell1ID。
SurfaceID:点数据数组,包含关于每个点的原点曲面的信息
Input0CellID:单元格数据数组,包含第一个输入网格上的原始单元格ID号
Input1CellID:单元格数据数组,包含第二个输入网格上的原始单元格ID号
NewCell0ID:单元格数据数组,包含关于它接触的重新网格的第一个输入表面的哪些单元格的信息(如果分割)
NewCell1ID:单元格数据数组,包含关于它在重新网格的第二个输入表面上接触哪些单元格的信息(如果分割)
第二个和第三个输出分别是第一个和第二个输入vtkPolyData。可选地,两个输出vtkPolyData可以通过重新网格沿着交点线分割。可选地,可以在重新网格结束时清洗和检查表面。
如果网格被分割,输出vtkpolydata包含三个可能的数据数组:
IntersectionPoint:这是一个布尔值,指示该点是否在两个输入对象的边界上
BadTriangle: 如果表面被清理和检查,这是一个单元格数据数组,指示单元格是否有多个相邻的边。对于这个数组,流形表面将处处为0 !
FreeEdge:如果表面被清洁和检查,这是一个单元格数据数组,指示单元格是否有自由边。一个不透水的表面,这个数组处处为0 !
注意:这个过滤器不是设计来执行二维布尔运算的,实际上依赖于没有共平面重叠单元格的输入。
存在问题:三角面片划分不正确
追踪问题为vtkPolygon的BoundedTriangulate造成的。
BoundedTriangulate结果示意图
Triangulate与 NonDegenerateTriangulate结果示意图
理想的结果示意图
SplitCell
1. IntersectionMapType* map为多关联的Map,记录与当前Cell相关的相交线(interLines)的ID。
2. 获取与当前Cell相关的所有相交线。
计算每个相交线的点,并采用vtkPointLocator进行插值。ptIdMap为当前点的ID,对应到当前Cell插值点的ID。
相关测试代码
zxIntersectionPolyDataFilter* PolyDataIntersection = zxIntersectionPolyDataFilter::New();
PolyDataIntersection->SetInputData(0, clean1->GetOutput());
PolyDataIntersection->SetInputData(1, clean2->GetOutput());
PolyDataIntersection->SplitFirstOutputOn();
PolyDataIntersection->SplitSecondOutputOn();
PolyDataIntersection->Update();
emit sendBooleanResult(PolyDataIntersection->GetOutput());
vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(PolyDataIntersection->GetOutputPort(1));
emit sendBooleanResult(mapper->GetInput());
vtkPolyDataMapper* mapper2 = vtkPolyDataMapper::New();
mapper2->SetInputConnection(PolyDataIntersection->GetOutputPort(2));
emit sendBooleanResult(mapper2->GetInput());