宝山武汉阳网站建设网络培训总结
前言:
vtkPolyDataConnectivityFilter 使用过,但网上没有看到完事的教程;这里整理一下;
提取数据集中连通的多边形数据。
该类是一个滤波器,提取cell(区域) - 拥有公共点或者满足某个阈值
该类在提取连通区域时候有如下6种模式:
1 )提取数据集中的最大(最多点)连接区域:SetExtractionModeTo LargestRegion();
2)提取指定区域号:SetExtractionModeTo SpecifiedRegions();
3)提取共享指定点ids的所有区域:SetExtractionModeTo PointSeededRegions();
4)提取共享指定单元ID的所有区域:SetExtractionModeTo CellSeededRegions();
5)提取最靠近指定点的区域:SetExtractionModeTo ClosestPointRegion();
6)提取所有区域(用于着色区域):SetExtractionModeTo AllRegions()
这个滤波器是针对多边形数据的。
通过修改 ScalarConnectivity 该布尔值,可以修改该类的行为。如果该值为true,算法中① 共享一个点的cell 会被认为是几何连通的;②cell中点的标量在指定的标量范围内;这两种情况下,cell会被认为是连通的。
如果 ScalarConnectivity 和 FullScalarConnectivity 都为 true,只有当cell中所有的点的标量值满足指定范围,该cell才会被认为是连通的。如果 FullScalarConnectivity 为false,cell中任何一个点满足标量的指定范围都会被认为是连通的。
ColorRegionsOn() 用于对不同的连通区域着色。
1. LargestRegion 这种通常取最大的哪个;
vtkNew<vtkPolyDataConnectivityFilter> ConnectivityFilter ;ConnectivityFilter->SetInputConnection(polyData);ConnectivityFilter->SetExtractionModeToLargestRegion();ConnectivityFilter->Updata()
// get largest region
mPolydata->DeepCopy(ConnectivityFilter->GetOutput());
2. SpecifiedRegions 可能会有多个连通区域,每个有相应Id;
需要在第6个的基础上,取其中一个 ;
vtkNew<vtkConnectivityFilter> connectivityFilter;connectivityFilter->SetInputData(mVtkPolyDataAll);connectivityFilter->SetExtractionModeToAllRegions();connectivityFilter->ColorRegionsOn();connectivityFilter->Update();int regionNum = connectivityFilter->GetNumberOfExtractedRegions() # 获取连通区域的数目
for (int i =0;i<regionNum;i++)
{connectivityFilter2 = vtk.vtkPolyDataConnectivityFilter()connectivityFilter2.SetInputData(mVtkPolyDataAll)connectivityFilter2.InitializeSpecifiedRegionList() # 清空要提取的连通区域号的列表connectivityFilter2.SetExtractionModeToSpecifiedRegions() # 用于提取一个或多个连通区域connectivityFilter2.AddSpecifiedRegion(i) # 设置提取的连通区域号connectivityFilter2.Update()// get one regionvtkPolyData * polydata = connectivityFilter2->GetOutput();
}
3. SetExtractionModeToPointSeededRegions 获取包含一个 点 id 的区域;
需要先找到一个点Id,这个 id 通常需要使用交互,鼠标选择得到 ;
vtkSmartPointer<vtkPolyDataConnectivityFilter> connectivityFilter =vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();connectivityFilter->SetInputData(appendFilter->GetOutput());connectivityFilter->SetExtractionModeToPointSeededRegions();connectivityFilter->AddSeed(100);connectivityFilter->Update();// get plydataconnectivityFilter->GetOutput();
4. SetExtractionModeToCellSeededRegions 需要指定一个 cell id;
vtkSmartPointer<vtkPolyDataConnectivityFilter> connectivityFilter = vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();connectivityFilter->SetInputData(polyData);connectivityFilter->SetExtractionModeToCellSeededRegions(); connectivityFilter->InitializeSeedList();connectivityFilter->AddSeed(cellId); connectivityFilter-Update();
6. SetExtractionModeToClosestPointRegion 提取最靠近指定点的区域
vtkSmartPointer<vtkPolyDataConnectivityFilter> connectivityFilter = vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();connectivityFilter->SetInputData(polyData);connectivityFilter->SetExtractionModeToClosestPointRegion(); connectivityFilter->InitializeSeedList();connectivityFilter->AddSeed(PointId); connectivityFilter-Update();
6. SetExtractionModeToAllRegions 获取所有连通区域
vtkSmartPointer<vtkPolyDataConnectivityFilter> connectFilter1=vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();connectFilter1->SetInputConnection(contourFilter->GetOutputPort());connectFilter1->SetExtractionModeToAllRegions();connectFilter1->ColorRegionsOn();connectFilter1->MarkVisitedPointIdsOn();connectFilter1->Update();int regionNum=connectFilter1->GetNumberOfExtractedRegions();qDebug()<<"regionNum:"<<regionNum;