寶山武漢陽網(wǎng)站建設(shè)衡水網(wǎng)站seo
前言:
?? vtkPolyDataConnectivityFilter 使用過,但網(wǎng)上沒有看到完事的教程;這里整理一下;
?
提取數(shù)據(jù)集中連通的多邊形數(shù)據(jù)。
該類是一個濾波器,提取cell(區(qū)域) - 擁有公共點或者滿足某個閾值
該類在提取連通區(qū)域時候有如下6種模式:
?? 1?)提取數(shù)據(jù)集中的最大(最多點)連接區(qū)域:SetExtractionModeTo LargestRegion();
??? 2)提取指定區(qū)域號:SetExtractionModeTo SpecifiedRegions();
??? 3)提取共享指定點ids的所有區(qū)域:SetExtractionModeTo PointSeededRegions();
??? 4)提取共享指定單元ID的所有區(qū)域:SetExtractionModeTo CellSeededRegions();
??? 5)提取最靠近指定點的區(qū)域:SetExtractionModeTo ClosestPointRegion();
??? 6)提取所有區(qū)域(用于著色區(qū)域):SetExtractionModeTo AllRegions()
這個濾波器是針對多邊形數(shù)據(jù)的。
通過修改 ScalarConnectivity 該布爾值,可以修改該類的行為。如果該值為true,算法中① 共享一個點的cell 會被認(rèn)為是幾何連通的;②cell中點的標(biāo)量在指定的標(biāo)量范圍內(nèi);這兩種情況下,cell會被認(rèn)為是連通的。
如果 ScalarConnectivity 和 FullScalarConnectivity 都為 true,只有當(dāng)cell中所有的點的標(biāo)量值滿足指定范圍,該cell才會被認(rèn)為是連通的。如果 FullScalarConnectivity 為false,cell中任何一個點滿足標(biāo)量的指定范圍都會被認(rèn)為是連通的。
ColorRegionsOn() 用于對不同的連通區(qū)域著色。
1. LargestRegion 這種通常取最大的哪個;
vtkNew<vtkPolyDataConnectivityFilter> ConnectivityFilter ;ConnectivityFilter->SetInputConnection(polyData);ConnectivityFilter->SetExtractionModeToLargestRegion();ConnectivityFilter->Updata()
// get largest region
mPolydata->DeepCopy(ConnectivityFilter->GetOutput());
2. SpecifiedRegions 可能會有多個連通區(qū)域,每個有相應(yīng)Id;
需要在第6個的基礎(chǔ)上,取其中一個 ;
vtkNew<vtkConnectivityFilter> connectivityFilter;connectivityFilter->SetInputData(mVtkPolyDataAll);connectivityFilter->SetExtractionModeToAllRegions();connectivityFilter->ColorRegionsOn();connectivityFilter->Update();int regionNum = connectivityFilter->GetNumberOfExtractedRegions() # 獲取連通區(qū)域的數(shù)目
for (int i =0;i<regionNum;i++)
{connectivityFilter2 = vtk.vtkPolyDataConnectivityFilter()connectivityFilter2.SetInputData(mVtkPolyDataAll)connectivityFilter2.InitializeSpecifiedRegionList() # 清空要提取的連通區(qū)域號的列表connectivityFilter2.SetExtractionModeToSpecifiedRegions() # 用于提取一個或多個連通區(qū)域connectivityFilter2.AddSpecifiedRegion(i) # 設(shè)置提取的連通區(qū)域號connectivityFilter2.Update()// get one regionvtkPolyData * polydata = connectivityFilter2->GetOutput();
}
?3. SetExtractionModeToPointSeededRegions 獲取包含一個 點 id 的區(qū)域;
需要先找到一個點Id,這個 id 通常需要使用交互,鼠標(biāo)選擇得到 ;
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 提取最靠近指定點的區(qū)域
vtkSmartPointer<vtkPolyDataConnectivityFilter> connectivityFilter = vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();connectivityFilter->SetInputData(polyData);connectivityFilter->SetExtractionModeToClosestPointRegion(); connectivityFilter->InitializeSeedList();connectivityFilter->AddSeed(PointId); connectivityFilter-Update();
6. SetExtractionModeToAllRegions 獲取所有連通區(qū)域
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;