日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VTK修炼之道51:图形基本操作进阶_连通区域分析

發布時間:2025/3/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VTK修炼之道51:图形基本操作进阶_连通区域分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.連通區域分析

許多圖形數據中,并非只包含一個對象(連通區域)。而在處理這些圖形數據時,有時需要對每一個對象單獨處理或者讓其單獨顯示。比如,利用MarchingCube方法提取三維圖像中的等值面,得到的結果往往是存在多個連通的對象區域,這是就需要對圖形數據做連通區域分析,提取每個連通區域并計算其屬性信息,以此來得到需要的連通區域。

下面一個例子來分析VTK中如何對圖形數據做連通區域分析:

#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h> #include <vtkSphereSource.h> #include <vtkConeSource.h> #include <vtkAppendPolyData.h> #include <vtkPolyDataConnectivityFilter.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkProperty.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> int main() {vtkSmartPointer<vtkSphereSource> sphereSource =vtkSmartPointer<vtkSphereSource>::New();sphereSource->SetRadius(10);sphereSource->SetThetaResolution(10);sphereSource->SetPhiResolution(10);sphereSource->Update();vtkSmartPointer<vtkConeSource> coneSource =vtkSmartPointer<vtkConeSource>::New();coneSource->SetRadius(5);coneSource->SetHeight(10);coneSource->SetCenter(25, 0, 0);coneSource->Update();vtkSmartPointer<vtkAppendPolyData> appendFilter =vtkSmartPointer<vtkAppendPolyData>::New();appendFilter->AddInputData(sphereSource->GetOutput());appendFilter->AddInputData(coneSource->GetOutput());appendFilter->Update();vtkSmartPointer<vtkPolyDataConnectivityFilter> connectivityFilter =vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();connectivityFilter->SetInputData(appendFilter->GetOutput());connectivityFilter->SetExtractionModeToCellSeededRegions();connectivityFilter->AddSeed(100);connectivityFilter->Update();vtkSmartPointer<vtkPolyDataMapper> originalMapper =vtkSmartPointer<vtkPolyDataMapper>::New();originalMapper->SetInputConnection(appendFilter->GetOutputPort());originalMapper->Update();vtkSmartPointer<vtkActor> originalActor =vtkSmartPointer<vtkActor>::New();originalActor->SetMapper(originalMapper);vtkSmartPointer<vtkPolyDataMapper> extractedMapper =vtkSmartPointer<vtkPolyDataMapper>::New();extractedMapper->SetInputConnection(connectivityFilter->GetOutputPort());extractedMapper->Update();vtkSmartPointer<vtkActor> extractedActor =vtkSmartPointer<vtkActor>::New();extractedActor->SetMapper(extractedMapper);/double leftViewport[4] = { 0.0, 0.0, 0.5, 1.0 };double rightViewport[4] = { 0.5, 0.0, 1.0, 1.0 };vtkSmartPointer<vtkRenderer> leftRenderer =vtkSmartPointer<vtkRenderer>::New();leftRenderer->SetViewport(leftViewport);leftRenderer->AddActor(originalActor);leftRenderer->SetBackground(1, 0, 0);vtkSmartPointer<vtkRenderer> rightRenderer =vtkSmartPointer<vtkRenderer>::New();rightRenderer->SetViewport(rightViewport);rightRenderer->AddActor(extractedActor);rightRenderer->SetBackground(0, 0, 0);vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(leftRenderer);renderWindow->AddRenderer(rightRenderer);renderWindow->SetSize(640, 320);renderWindow->Render();renderWindow->SetWindowName("PolyDataConnectedCompExtract");leftRenderer->ResetCamera();rightRenderer->SetActiveCamera(leftRenderer->GetActiveCamera());vtkSmartPointer<vtkRenderWindowInteractor> interactor =vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);interactor->Initialize();interactor->Start();return 0; }輸出結果為:


這個例子夠早了一個含有多個連通區域的模型數據。vtkAppendPolyData可以實現vtkPolyData的合并,使用該類可以方便地構造含有多個連通區域的數據,該類型接收兩個或者多個vtkPolyData數據輸入,合并結果包含輸入數據的所有幾何和拓撲數據。若輸入為兩個或者多個數據都含有點屬性數據,則將其存儲值輸出結果中;對于單元屬性數據亦是如此。

2.VTKPolyDataConnectivityFilter類解析

vtk中的vtkPolyDataConnectivityFilter類可以用于實現連通區域分析,該類接受vtkPolyData數據作為輸入。集體使用如下: vtkSmartPointer<vtkPolyDataConnectivityFilter> connectivityFilter =vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();connectivityFilter->SetInputData(appendFilter->GetOutput());connectivityFilter->SetExtractionModeToCellSeededRegions();connectivityFilter->AddSeed(100);connectivityFilter->Update();SetExtractionModeToLargestRegion():用于提取具有最多點數的連通區域; SetExtractionModeToAllRegions():該模式主要用于連通區域標記,配合函數ColorRegionsOn()使用,在連通區域像是的同時,生成一個名為RegionId的點屬性數據。
SetExtractionModeToSpecifiedRegions():該模式用于提取一個或多個連通區域,在該模式下,需要通過AddSpecifiedRegion()來添加西藥提取的區域號,區域號從零開始。 SetExtractionModeToClosestPointRegion():該模式需要使用SetClosestPoint()函數設置一個空間點坐標,執行結果為離該點最近的連通區域。 SetExtractionModeToPointSeededRegions():該模式下需要使用AddSeed()函數添加種子點,提取種子點所在的區域。 SetExtractionModeToCellSeededRegions():該模式下需要使用AddSeed()函數調價種子單元,提取種子單元所在的區域。

3.參看資料

1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開發進階[M]. 機械工業出版社, 2015.

總結

以上是生活随笔為你收集整理的VTK修炼之道51:图形基本操作进阶_连通区域分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。