0 導學
目的:掌握利用三維效果表達科學和工程資料的能力
傳播一種思想:可視化技術是資料之眼

內容組織:
流體資料的標量可視化、矢量可視化實體
三維掃描資料(模型/地形)可視化實體
三維地球場景可視化實體
曲線UI互動控制可視化實體
1 基礎運用
科學計算可視化的主要方法:
二維標量資料場:顏色映射法、等值線方法、立體圖法和層次分割法
三維標量資料場:面繪制方法、體繪制方法
矢量資料場:直接法(箭頭、線段、色輪等手段表示矢量資料)、流線法
應用領域:地球科學、大氣科學、醫學/生命科學、生物/分子科學、航空/航天/工業、化工/化學、物理/力學、人類/考古、地址勘探等
1.1 TVTK入門
TVTK庫是在標準VTK庫之上用traits進行了封裝,因此可以查看VTK庫檔案https://vtk.org/doc/nightly/html/annotated.html
TVTK庫中類名去除了前綴vtk
函式名按照Python慣例,采用下劃線連接單詞,如AddItem->add_item
VTK物件的方法在TVTK中用Trait屬性替代,例如VTK中m.SetInputConnection(c.GetOutputPort()),TVTK中m.input_connection(c.output_port)
安裝:
conda install vtk
conda install numpy
conda install traits
conda install mayavi
conda install PyQt
或者從https://www.lfd.uci.edu/~gohlke/pythonlibs/下載對應用whl檔案pip安裝
安裝完測驗下

from tvtk.tools import tvtk_doc tvtk_doc.main()
In[3]: from tvtk.api import tvtk
In[4]: s = tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
In[5]: print(s)
vtkCubeSource (000001A7ACDECA70)
Debug: Off
Modified Time: 132
Reference Count: 2
Registered Events:
Registered Observers:
vtkObserver (000001A7B0699C20)
Event: 33
EventName: ModifiedEvent
Command: 000001A7B097C560
Priority: 0
Tag: 1
Executive: 000001A7B0418800
ErrorCode: No error
Information: 000001A7AD8034D0
AbortExecute: Off
Progress: 0
Progress Text: (None)
X Length: 1
Y Length: 2
Z Length: 3
Center: (0, 0, 0)
Output Points Precision: 0
創建一個基本三維物件
s = tvtk.CubeSource(traits)
s表示物件變數,回傳一個三維物件實體
tvtk.CubeSource是一個建構式,構造具有一定traits屬性的長方體資料源物件
什么是traits,英文意思的屬性,由于python變數沒有型別,導致實際操作中遇到了些不便利,traits庫可以為python添加型別定義,由于tvtk正是在vtk上用traits庫進行的封裝形式,為了更簡單的理解,我們可以認為traits就是tvtk物件的屬性

此外tvtk還有其他基本三維物件
試著建立個圓錐體資料源看看
In[3]: from tvtk.api import tvtk
In[4]: s = tvtk.ConeSource(height=3.0,radius=1.0,resolution=36)
In[5]: s.height
Out[5]: 3.0
In[6]: s.radius
Out[6]: 1.0
In[7]: s.resolution
Out[7]: 36
In[8]: s.center
Out[8]: array([0., 0., 0.])
In[9]: print(s)
vtkConeSource (000002CC5566E290)
Debug: Off
Modified Time: 134
Reference Count: 2
Registered Events:
Registered Observers:
vtkObserver (000002CC572346C0)
Event: 33
EventName: ModifiedEvent
Command: 000002CC573449D0
Priority: 0
Tag: 1
Executive: 000002CC56FFA700
ErrorCode: No error
Information: 000002CC5722B540
AbortExecute: Off
Progress: 0
Progress Text: (None)
Resolution: 36
Height: 3
Radius: 1
Capping: On
Center: (0, 0, 0)
Direction: (1, 0, 0)
Output Points Precision: 0
顯示一個三維物件

from tvtk.api import tvtk # 創建一個長方體資料源,并且同時設定其長寬高 s = tvtk.CubeSource(x_length=1.0, y_length=2.0, z_length=3.0) # 使用PolyDataMapper將資料轉換為圖形資料 m = tvtk.PolyDataMapper(input_connection=s.output_port) # 創建一個Actor a = tvtk.Actor(mapper=m) # 創建一個Renderer,將Actor添加進去 r = tvtk.Renderer(background=(0, 0, 0)) r.add_actor(a) # 創建一個RenderWindow(視窗),將Renderer添加進去 w = tvtk.RenderWindow(size=(300, 300)) w.add_renderer(r) # 創建一個RenderWindowInteractor(視窗的互動工具) i = tvtk.RenderWindowInteractor(render_window=w) # 開啟互動 i.initialize() i.start()
將長方體資料轉化為三維影像運用了什么技術?
管線(Pipeline),物件之間協調完成作業的程序,需要眾多的的TVTK物件共同協調完成,如tvtk.CubeSource、tvtk.PolyDataMapper、tvtk.Actor、tvtk.Renderer、tvtk.RenderWindow、tvtk.RenderWindowInteractor
1.2 TVTK管線與資料加載
管線基本流程

幾乎所有渲染引擎都會涉及管線技術,TVTK管線分為2部分,其中:
可視化管線:將原始資料加工為圖形資料的程序

圖形管線:圖形資料加工為我們所看到的影像的程序


IVTK工具觀察管線
from tvtk.api import tvtk from tvtk.tools import ivtk from pyface.api import GUI s = tvtk.CubeSource(x_length=1.0, y_length=2.0, z_length=3.0) m = tvtk.PolyDataMapper(input_connection=s.output_port) a = tvtk.Actor(mapper=m) #創建一個帶Crust(Python Shell)的視窗 gui = GUI() win = ivtk.IVTKWithCrustAndBrowser() win.open() win.scene.add_actor(a) #開始界面訊息回圈 gui.start_event_loop()
由于版本過高,from tvtk.tools import ivtk,這句出現錯誤,,,


TVTK資料集
資料集,包括點與資料,點之間有連接和非連接關系,多個相關的點組成單元,點的連接有隱式和顯示,資料有標量和矢量
TVTK五種資料集:
ImageData表示二維或三維影像的資料結構,可以簡單的理解為二維或三維陣列,特點是在陣列中存放資料,點位于正交且等距的網格上,我們不需要給出坐標,點之間的連接關系由它們在陣列中的位置確定,點的連接關系是隱性的



from tvtk.api import tvtk
img = tvtk.ImageData(spacing=(1,1,1),origin=(1,2,3),dimensions=(3,4,5))
print(img.get_point(0))
for n in range(6):
print("%.1f,%.1f,%.1f"% img.get_point(n))
RectilinearGrid:間距不均勻的網格,所有點都在正交的網格上
如何構建
from tvtk.api import tvtk import numpy as np x = np.array([0,3,9,15]) y = np.array([0,1,5]) z = np.array([0,2,3]) r = tvtk.RectilinearGrid() r.x_coordinates = x r.y_coordinates = y r.z_coordinates = z r.dimensions = len(x),len(y),len(z)
同樣可以查看
StructuredGrid:創建任意形狀的網格,需要指定點的坐標
PolyData:由一系列的點和點之間的聯系、點構成的多邊形組成

由于這些資訊都要用戶設定,因此用程式創建PolyData比較繁瑣,TVTK很多三維模型可以輸出PolyData物件
TVTK資料加載
大多數可視化資料并非是TVTK庫中構建,而是通過介面讀取外部資料檔案
TVTK庫繼承關系
VTK三維模型讀取
STL檔案是在計算機圖形應用系統中用于表示三角形網格的一種檔案格式,這種格式非常簡單,應用很廣泛
from tvtk.api import tvtk from tvtkfunc import ivtk_scene,event_loop s = tvtk.STLReader(file_name = "python.stl") m = tvtk.PolyDataMapper(input_connection = s.output_port) a = tvtk.Actor(mapper = m) win = ivtk_scene(a) win.scene.isometric_view() event_loop()

from tvtk.api import tvtk
def read_data():# 讀入資料
plot3d = tvtk.MultiBlockPLOT3DReader(
xyz_file_name="combxyz.bin",#網格檔案
q_file_name="combq.bin",#空氣動力學結果檔案
scalar_function_number=100,#設定標量資料數量
vector_function_number=200#設定矢量資料數量
)
plot3d.update()
return plot3d
plot3d = read_data()
grid = plot3d.output.get_block(0)
的2
待續
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/160771.html
標籤:Python
上一篇:【2020Python修煉記】面向物件編程——繼承與派生
下一篇:Python - 集合
