首頁 > 軟體

Python-VTK隱式函數屬性選擇和剪下資料

2022-04-18 19:01:12

前言:

VTK,(visualizationtoolkit)是一個開放資源的免費軟體系統,主要用於三維計算機圖學、影象處理和視覺化。Vtk是在物件導向原理的基礎上設計和實現的,它的核心是用C++構建的,包含有大約250,000行程式碼,2000多個類,還包含有幾個轉換介面,因此也可以自由的通過Java,Tcl/Tk和Python各種語言使用vtk。

本文主要介紹瞭如何利用隱式函數的屬性來選擇和剪下資料,尤其是如何使用區域分隔屬性來選擇資料。

使用隱式函數選擇或提取資料意味著選擇位於函數特定區域內的單元和點(以及相關屬性資料)。為了確定點x-y-z是否位於某個區域內,我們只需計算該點並檢查結果的座標符號。如果單元的所有點都位於區域中,則單元位於該區域中。這裡,兩個橢圓組合使用來選擇體積資料集中的體素。注意,提取資料通常會改變資料集的結構。在本例中,輸入型別是影象資料集,而輸出型別是非結構化網格資料集。

函數介紹:

vtkQuadricClustering 是一個用於削減三角形的類,得到一個近似的幾何圖形。它的輸入是vtkPolyData型別的資料,可以處理所有型別的多邊形網格,它的速度是很快的。它能快速的削減大網格模型,並且支援網格片段削減(利用startAppend, Append, endAppend方法),這樣可以避免把整個模型載入記憶體中。對於大型網路模型,它有較好的效果,但是當網格變小時,三角化效果不是很好,需結合其它的方法。

vtk.vtkSampleFunction 是VTK中的一個隱函數表示類,能夠用於對曲面進行等間隔逐點取樣。

vtkShrinkFilter 收縮構成對其質心任意資料集的單元格。單元格點的平均位置作為計算單元的質心。萎縮中斷開另一個單元格的結果。此篩選器的輸出是的一般資料集型別 vtkUnstructuredGrid。

import vtk


def main():
    colors = vtk.vtkNamedColors()

    ren1 = vtk.vtkRenderer()

    renWin = vtk.vtkRenderWindow()
    renWin.AddRenderer(ren1)

    iren = vtk.vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)

    quadric = vtk.vtkQuadric()
    quadric.SetCoefficients(0.5, 1, 0.2, 0, 0.1, 0, 0, 0.2, 0, 0)

    sample = vtk.vtkSampleFunction()
    sample.SetSampleDimensions(50, 50, 50)
    sample.SetImplicitFunction(quadric)
    sample.ComputeNormalsOff()

    trans = vtk.vtkTransform()
    trans.Scale(1, 0.5, 0.333)

    sphere = vtk.vtkSphere()
    sphere.SetRadius(0.25)
    sphere.SetTransform(trans)

    trans2 = vtk.vtkTransform()
    trans2.Scale(0.25, 0.5, 1.0)

    sphere2 = vtk.vtkSphere()
    sphere2.SetRadius(0.25)
    sphere2.SetTransform(trans2)

    booleanUnion = vtk.vtkImplicitBoolean()
    booleanUnion.AddFunction(sphere)
    booleanUnion.AddFunction(sphere2)
    booleanUnion.SetOperationType(0)  # boolean Union

    extract = vtk.vtkExtractGeometry()
    extract.SetInputConnection(sample.GetOutputPort())
    extract.SetImplicitFunction(booleanUnion)

    shrink = vtk.vtkShrinkFilter()
    shrink.SetInputConnection(extract.GetOutputPort())
    shrink.SetShrinkFactor(0.5)

    dataMapper = vtk.vtkDataSetMapper()
    dataMapper.SetInputConnection(shrink.GetOutputPort())
    dataActor = vtk.vtkActor()
    dataActor.SetMapper(dataMapper)

    # outline
    outline = vtk.vtkOutlineFilter()
    outline.SetInputConnection(sample.GetOutputPort())

    outlineMapper = vtk.vtkPolyDataMapper()
    outlineMapper.SetInputConnection(outline.GetOutputPort())

    outlineActor = vtk.vtkActor()
    outlineActor.SetMapper(outlineMapper)
    outlineActor.GetProperty().SetColor(0, 0, 0)

    # 將actor新增到視窗中,並設定相關視窗的大小
    #
    ren1.AddActor(outlineActor)
    ren1.AddActor(dataActor)
    ren1.SetBackground(colors.GetColor3d("SlateGray"))

    renWin.SetWindowName('ExtractData')

    renWin.Render()
    ren1.GetActiveCamera().Azimuth(30)
    ren1.GetActiveCamera().Elevation(30)

    renWin.Render()
    iren.Start()


if __name__ == '__main__':
    main()

結果如下:

到此這篇關於Python-VTK隱式函數屬性選擇和剪下資料的文章就介紹到這了,更多相關Python VTK 選擇與剪下資料內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com