VTK資料結構2

2021-07-24 19:57:42 字數 4316 閱讀 3509

資料集由乙個或多個單元組成,圖6.6和6.7列出了vtk支援的線性和非線性型別的單元。一系列有序的點按指定型別連線所定義的結構就是單元(cell),單元是視覺化系統的基礎。這些點的連線順序通常也稱為頂點列表(connectivity list);所指定的型別定義了單元的拓撲結構,而點的座標定義了單元的幾何結構。

比如,圖6.8是型別為六面體(hexahedron)的單元,頂點列表(由點的索引號表示,即8-10-1-6-21-22-5-7,每個點通過索引號可在頂點列表中檢索到該點的實際座標值)定義了六面體單元的拓撲結構,從圖中可以看出,索引為8和10的點連線就構成了六面體十二條邊中的其中一條,而8-10-1-6這四個點連線就構成了六面體其中的乙個面。在這個示例中,可以看出單元是由單元的型別

(如六面體

)和構成單元的頂點列表兩部分構成。

通常我們用數學符號c

i來表示單元,換言之,單元就是乙個有順序的點集:c

i = ,其中pi

∈p,p就是該有序的點集。單元的型別決定了點集裡點的順序,或者說單元的拓撲;而定義單元的點的個數就是該單元的大小(size)。

單元的拓撲維度除了三維(圖6.8)之外,還可以是零維、一維、二維等,如零維的頂點(vertex)、一維的線(line)以及二維的三角形(********)。單元可以是基本型別或者基本型別的組合,基本型別是指不可再分的單元,組合型別是由基本型別組合而成。比如,三角形條帶(******** strip)是由多個三角形所組成,即三角形條帶可以分解成多個三角形,而三角形是二維的基本單元型別。所以,對於單元的型別而言,理論上由不同型別的單元可以組合成無數種,vtk應用程式需要用到哪些型別的單元應該根據具體的要求。總的來說,vtk裡的單元型別分為線性、非線性(圖6.6和圖6.7)和其他型別,接下來的內容主要介紹vtk裡定義的單元型別。

單元型別的線性與非線性的劃分主要是以插值函式為依據的,對於線性單元,採用的是線性或者常量插值函式。另外,單元裡的任意一條邊都是由兩個點連線定義的。vtk裡單元的型別定義在vtkcelltype.h檔案裡,線性的單元型別有:

vertex:vtk_vertex,頂點,由乙個點定義,是零維的基本型別。

polyvertex:vtk_poly_vertex,多頂點,多個頂點組合而成,是零維的組合單元,其定義不受頂點順序的限制。

line:vtk_line,直線,一維的基本型別,由兩個點定義,方向是從第乙個點指向第二個點。

polyline:vtk_poly_line,折線,由一條或多條直線組合而成,屬於一維的型別。由n+1個有序的點連線定義的,n表示折線的線段條數,每兩個點(i, i+1)定義一條線段。

********:vtk_********,三角形,二維的基本型別,由三個點按逆時針的方向連線定義的,點的連線方向和表面法向量符合右手法則,即除大拇指外的手指沿著點的方向彎曲,大拇指所指向的方向就是表面法向量。

********strip:vtk_********_strip,三角形條帶,由乙個或多個三角形組合而成,二維的型別。由n+2個有序的點連線定義的,n表示三角形條帶裡三角形的個數,定義三角形條帶的點不需要共面。定義每個三角形的頂點順序為(i, i+1, i+2),0≦i≦n。

quadrilateral:vtk_quad,四邊形,二維的基本型別,由共面的四個點按逆時針的方向連線定義的。四邊形要求是凸多邊形,且它的邊不能相交。利用右手法則可以得到該四邊形的表面法向量。

pixel:vtk_pixel,二維的基本型別,由共面的四個點按一定的順序連線定義的。該型別的單元與四邊形的區別在拓撲結構上,pixel型別要求相鄰的兩條邊必須垂直,而且相對的兩條邊要與座標軸平行,因此pixel的表面法向量也與其中的一條座標軸平行。

圖6.6 vtk裡定義的線性的cell型別

圖6.7vtk裡定義的非線性的cell型別

圖6.8 六面體cell

定義pixel的四個頂點的順序與四邊形的不同,如圖6.6-h所示,pixel頂點的計數是先沿著x軸的方向,然後是y軸,最後是z軸方向。pixel是四邊形型別的特殊形式,但要注意這裡的pixel是一種單元型別,與影象畫素(pixel)的概念是不同的。pixel具體表達什麼意思,需要根據上下文來作判斷。

polygon:vtk_polygon,多邊形,二維的基本型別,由共面的三個或以上的點按逆時針方向的順序連線定義的。多邊形表面法向量的方向通過右手法則確定。

多邊形可以是凹多邊形,也可以是凸多邊形,但是不能含有內部迴圈或者出現相交的邊。多邊形有n條邊,n就是組成多邊形的點的個數。

tetrahedron:vtk_tetra,四面體,三維的基本型別,由不共面的四個點兩兩連線定義的。如圖6.6-j所示,四面體有六條邊和四個面。

hexahedron:vtk_hexahedron,六面體,三維的基本型別,包含六個四邊形表面、12條邊和8個頂點。其中8個頂點的連線順序如圖6.6-k所示,六面體要求必須是凸的。

voxel:vtk_voxel,三維的基本型別,與六面體的拓撲一樣,但幾何上有所區別。voxel要求相鄰的兩個面必須垂直,點的連線順序如圖6.6-l所示。voxel是六面體的特殊形式。與pixel類似,voxel與三維影象體素(voxel)的概念是不同的。

wedge:vtk_wedge,楔形,三維的基本型別,由三個四邊形面、兩個三角形面、九條邊和六個頂點構成。六個點的連線順序如圖6.6-m所示。要求面和邊不能與其他的相交,且楔形必須是凸的。

pyramid:vtk_pyramid,角椎體,三維的基本型別,由乙個四邊形面、四個三角形面、八條邊和五個頂點構成。構成角椎體的點的連線順序如圖6.6-n所示。定義四邊形的四個點要求是共面的,且四個點構成的四邊形必須是凸的,第五個點與其他四個點不在乙個面上。

pentagonalprism:vtk_pentagonal_prism,五稜柱,三維的基本型別,由五個四邊形面、兩個五邊形面、十五條邊和十個頂點構成。點的連線順序如圖6.6-o所示。五稜柱的面和邊不能與其他的相交,且五稜柱必須是凸的。

hexagonalprism:vtk_hexagonal_prism,六角柱,三維的基本型別,由六個四邊形面、兩個六邊形面、十八條邊和十二個頂點構成。點的連線順序如圖6.6-p所示。六角柱的面和邊不能與其他的相交,且六角柱必須是凸的。

數值分析領域裡,為了更準確、精確地表達資料,採用非線性單元作為資料的基本表達結構。線性單元和非線性單元的不同點是在繪製和資料處理方法方面,線性單元可以很容易的轉換成線性圖元被圖形庫處理,而非線性單元不被圖形庫直接支援,因此非線性單元必須先轉換成線性單元以後,才能被圖形庫所支援。

vtk除了提供一套複雜的非線性單元介面框架,另一種做法就是在非線性單元的每一條曲線增加乙個關鍵點(如圖6.7所示),或者增加乙個曲面來近似模擬非線性單元。視覺化系統在處理非線性單元時,一種比較流行的做法就是細化(tessellation)非線性單元,充分利用線性單元的視覺化演算法。但是細化的過程必須謹慎處理,否則會導致過分細分,造成過多的線性單元。

vtk在細化非線性單元時,採取如圖6.9所示固定的細化方式。一條二次曲線通過加入乙個關鍵點,細化成兩點直線;乙個二次三角形分別在三條邊上增加三個點,細化成四個線性三角形;乙個二次四邊形分別在四條邊上增加四個點,細化成四個線性四邊形。也就是:在vtk裡,二次曲線(quadraticedge)是一維的基本單元,由三個點定義,前兩個點定義了曲線的起點和終點,第三個點位於起點與終點的中間位置(參考圖6.7-a);二次三角形(quadratic********)是二維的基本單元,由六個點定義,前三個點位於三角形的頂點,後三個點位於每條曲線的中點位置;二次四邊形(quadraticquadrilateral)也是二維的基本單元,由八點定義,前兩個點位於四邊形的四個頂點處,後四個點位於每條邊的中點位置。其他型別的非線性單元可參考圖6.7。

圖6.9vtk細化非線性單元示意圖

資料結構 2

2016 02 06 17 38 指標和陣列 指標和一維陣列 陣列名一維陣列名是個指標常量,它存放的是一維陣列第乙個元素的位址,它的值不能被改變 一維陣列名指向的是陣列的第乙個元素 下標和指標的關係 a i a i 假設指標變數的名字為p 則p i的值是p i p所指向的變數所佔的位元組數 指標變數...

資料結構2

定義 只允許在一端插入和刪除的線性表 允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 bottom 特點後進先出 lifo 棧的棧的主要操作 棧的主要操作主要操作 棧的主要操作 adtstack 棧的陣列表示 順序棧 define stacksize 100typedef char stack...

資料結構 2

class queue object 佇列 雙端佇列 def init self 私有化,封裝 self.queue def enqueue self item 從尾部往佇列中新增乙個元素 def enqueue start self item 從頭部新增元素 雙 self.queue.insert...