科學計算三維可視化---TVTK庫可視化實例

一:TVTK庫可視化實例

Plot3D文件知識:PLOT3D 數據格式

PLOT3D文件分爲網格文件(XYZ 文件), 空氣動力學結果文件 (Q 文件)和通用結果文件(函數文件 + 函數名稱文件)。網格文件中可加入所謂的IBlank參數。

 

(一)標量數據可視化(等值面)

generate_values()建立等值面

from tvtk.api import tvtk
from Tvtkfunc import ivtk_scene,event_loop

def read_data():    #導入數據
    plot3d = tvtk.MultiBlockPLOT3DReader(
        xyz_file_name="comxyz.bin", #網格文件
        q_file_name="combq.bin", #開啓動力學結果文件
        scalar_function_number = 100, #設置標量數據數量
        vector_function_number=200, #設置矢量數據數量
    )   #讀入Plot3D數據
    plot3d.update() #讓plot3D計算器輸出數據
    return plot3d

plot3d = read_data()
grid = plot3d.output.get_block(0)   #獲取讀入的數據集對象

con = tvtk.ContourFilter()  #建立等值面對象
con.set_input_data(grid)    #將網格與其綁定
con.generate_values(10,grid.point_data.scalars.range) #指定輪廓數和數據範圍 其中輪廓數越大,越豐富多彩  #映射顏色最小紅色,最大藍色

m = tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range, #設置映射器的變量範圍屬性
                        input_connection=con.output_port)
a = tvtk.Actor(mapper=m)
a.property.opacity = 0.5    #設置透明度爲0.5

win = ivtk_scene(a)
win.scene.isometric_view()
event_loop()

set_value設置每一個等值面的值

第一個參數是指定第幾個等值面,第二個參數是設置該等值面的值
set_value(0,0.3)

(二)矢量數據可視化(有數值和方向)

箭頭大小能夠表示標量信息,箭頭方向能夠表示矢量的方向
爲了可以在矢量數據網格中放置箭頭符號,咱們能夠使用TVTK庫中提供的Glyph3D符號化技術,能夠產生放縮,着色,和具備方向的符號

在通常狀況下,因爲矢量數據過於密集,爲了使得繪製速度更快,讓箭頭的密度適中,咱們能夠使用降維的方法,來下降數據的密度

from tvtk.api import tvtk
from Tvtkfunc import ivtk_scene,event_loop

def read_data():    #導入數據
    plot3d = tvtk.MultiBlockPLOT3DReader(
        xyz_file_name="comxyz.bin", #網格文件
        q_file_name="combq.bin", #開啓動力學結果文件
        scalar_function_number = 100, #設置標量數據數量
        vector_function_number=200, #設置矢量數據數量
    )   #讀入Plot3D數據
    plot3d.update() #讓plot3D計算器輸出數據
    return plot3d


plot3d = read_data()
grid = plot3d.output.get_block(0)   #獲取讀入的數據集對象

#對數據集中的數據進行隨機選取,每50個點選擇一個點,是對數據進行降採樣
mask = tvtk.MaskPoints(random_mode=True,on_ratio=50)
mask.set_input_data(grid)   #將grid和mask相連
#建立表示箭頭的PolyData數據集
glyph_source = tvtk.ArrowSource()
#在Mask採樣後的PolyData數據集每一個點上放置一個箭頭
#箭頭的方向(速度方向),長度<箭頭越大,表示標量越大>和顏色<也表示標量大小,紅色小,藍色大>(兩個都表示密度)因爲點對應的矢量和標量數據決定

#將上面的降採樣數據與箭頭符號化相關聯
glyph
= tvtk.Glyph3D(input_connection=mask.output_port, scale_factor=4) #scale_factor符號的共同放縮係數 glyph.set_source_connection(glyph_source.output_port) m = tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range, #設置映射器的變量範圍屬性 input_connection=glyph.output_port) a = tvtk.Actor(mapper=m) a.property.opacity = 0.5 #設置透明度爲0.5 win = ivtk_scene(a) win.scene.isometric_view() event_loop()

總結矢量化數據可視化的三個方法

(1)Glyph3D是TVTK的符號化技術

降採樣的數據會被傳入做爲他的數據源,他輸入數據的每一個點,都會拷貝一個符號,符號自己是經過ArrowSource建立,由set_source_connection關聯ployData和箭頭

(2)MaskPoints降採樣,可輸出降採樣先後點的數目查看效果

降採樣前

降採樣後

(3)ArrowSource方法修改

建立了表示箭頭的PolyData數據集
glyph_source = tvtk.ArrowSource()  
glyph_source = tvtk.ConeSource()
設置防縮係數:scale_factor = 2

 

(三)空間輪廓線可視化

from tvtk.api import tvtk
from tvtk.common import configure_input from Tvtkfunc import ivtk_scene,event_loop

def read_data():    #導入數據
    plot3d = tvtk.MultiBlockPLOT3DReader(
        xyz_file_name="comxyz.bin", #網格文件
        q_file_name="combq.bin", #開啓動力學結果文件
        scalar_function_number = 100, #設置標量數據數量
        vector_function_number=200, #設置矢量數據數量
    )   #讀入Plot3D數據
    plot3d.update() #讓plot3D計算器輸出數據
    return plot3d


plot3d = read_data()
grid = plot3d.output.get_block(0)   #獲取讀入的數據集對象

outline = tvtk.StructuredGridOutlineFilter()    #計算表示外邊框的PolyData對象
configure_input(outline,grid)   #調用tvtk.common.configure_input(),將外框計算與數據集產生關聯

m = tvtk.PolyDataMapper(input_connection=outline.output_port)
a = tvtk.Actor(mapper=m)
a.property.color = 0.3,0.3,0.3  #float色彩空間0-1.0

win = ivtk_scene(a)
win.scene.isometric_view()
event_loop()

思路擴展:

將空間輪廓可視化和標量數據可視化或者矢量數據可視化一塊兒使用,造成更加完善的形狀
相關文章
相關標籤/搜索