網格平滑vtkSmoothPolyDataFilter

網格平滑vtkSmoothPolyDataFilter

網格平滑是一種調整數據集中點座標的技術。網格平滑的目的是提高網格的外觀和提高單元數據集的形狀。在平滑過程中,不會改變數據集的拓撲結構,只改變幾何結構。網格平滑的應用包括提高等值面的外觀,或者作爲移除表面噪聲的模型工具。通過應用網格平滑,模型的外觀能夠動態地提高。

在這裏插入圖片描述

拉普拉斯平滑是一種常用的平滑算法。VTK中 的vtkSmoothPolyDataFilter類實現了網格的拉普拉斯平滑算法,原理如下面公式:

在這裏插入圖片描述
其中:Xnew表示新的座標位置,X表示當前的座標位置。j表示X的鄰域點個數,Xi表示第i個鄰域點的座標位置。
vtkSmoothPolyDataFilter::SetNumberOfIterations()控制平滑次數,次數越大平滑越厲害,即細節損失越多。該類中還有多個變量來控制平滑過程,利用這些變化在一定程度岸上可以控制細節的損失。BoundarySmoothing控制是否對邊界點平滑。FeatureEdgeSmoothing控制是否對特徵邊上的點的平滑。如果一條邊被兩個鄰近的多邊形公用,若這兩個多邊形法向量的夾角(特徵角)大於定義的閾值,則說明這邊爲一條特徵邊。雖然通過特徵邊平滑設置可以降低一部分細節損失,並不能完全避免,且隨着拉普拉斯平滑的不斷迭代,模型會逐漸向網格的中心收縮。所以vtkWindowedSincPolyData是一個更好的選擇,該算法使用窗口Sinc函數實現網格平滑,能夠最小程度地避免收縮。

demo

vtkSmartPointer<vtkSmoothPolyDataFilter>smooth=
			vtkSmartPointer<vtkSmoothPolyDataFilter>::New();
smooth->AddInputConnection(otherFilter->GetOutputPort());
smooth->SetRelaxationFactor(0.01);
smooth->SetNumberOfIterations(10);
smooth->SetFeatureEdgeSmoothing(false);
smooth->SetBoundarySmoothing(false);
smooth->Update();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章