VTK圖形圖像開發進階-學習筆記 03 VTK的基本數據結構

3.1可視化數據的基本特點

(1)離散性

(2)數據具有規則或者不規則的結構(結構化與非結構化)

(3)數據具有維度

3.2 數據對象和數據集

3.2.1 vtkDataObject

VTK中,數據一般以數據對象(Data Object,類vtkDataObjiect)的形式表現,這是VTK裏可視化數據最常用的表達形式。數據對象是數據的集合,數據對象表現的數據是可以被可視化管線處理的數據,只有當數據對象被組織成一種結構後,才能被VTK提供的可視化算法所處理。

3.2.2 vtkDataSet

將數據對象組織成一種結構並且賦予相應的屬性值,就形成了數據集(Dataset)

vtkDataSet由兩部分組成,即組織結構以及與組織結構相關聯的屬性數據

vtkDataSet的組織結構由拓撲結構和集合結構兩部分組成。拓撲結構描述了對象的構成形式,幾何結構描述了對象的空間位置關係。

點數據所定義的一系列座標點構成了vtkDataSet數據集的幾何結構;點數據的連接形成單元數據,由單元數據形成了數據集的拓撲結構。

/****************************************************/
/*  Examples/Chap03/3.2_TrianglePoints.cpp     */
/****************************************************/

#include <vtkSmartPointer.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataWriter.h>

int main(int argc, char* argv[])
{

	// 創建點數據
	vtkSmartPointer<vtkPoints> points =
				vtkSmartPointer<vtkPoints>::New();
	points->InsertNextPoint(1.0, 0.0, 0.0);
	points->InsertNextPoint(0.0, 0.0, 0.0);
	points->InsertNextPoint(0.0, 1.0, 0.0);

	// 創建vtkPolyData類型數據,vtkPolyData派生自vtkPointSet
	// vtkPointSet是vtkDataSet子類,即vtkPolyData是一種數據集
	vtkSmartPointer<vtkPolyData> polyData =
		vtkSmartPointer<vtkPolyData>::New();

	// 將創建的點數據加入到vtkPolyData數據裏
	polyData->SetPoints(points);

	//將vtkPolyData類型的數據寫入到一個vtk文件,保存位置是工程當前目錄
	vtkSmartPointer<vtkPolyDataWriter> writer =
		vtkSmartPointer<vtkPolyDataWriter>::New();
	writer->SetFileName("triangle.vtk");
	writer->SetInputData(polyData);
	writer->Write();

	return 0;

}

/****************************************************/
/*  Examples/Chap03/3.2_TriangleVertices.cpp     */
/****************************************************/

#include <vtkSmartPointer.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPolyDataWriter.h>

int main(int argc, char* argv[])
{

	// 創建點座標
	double X[3] = { 1.0, 0.0, 0.0 };
	double Y[3] = { 0.0, 0.0, 0.0 };
	double Z[3] = { 0.0, 1.0, 0.0 };

	// 創建點數據以及在每個點座標上加入頂點(Vertex)類型的單元
	// vtkPointSet是vtkDataSet子類,即vtkPolyData是一種數據集
	vtkSmartPointer<vtkPoints> points =
						vtkSmartPointer<vtkPoints>::New();
	vtkSmartPointer<vtkCellArray> vertices =
		vtkSmartPointer<vtkCellArray>::New();

	for (unsigned int i = 0; i < 3; ++i)
	{
		// 定義用於存儲點索引的中間變量,vtkIdType就相當於int long等類型
		vtkIdType pid[1];

		// 把每個點座標加入vtkPoints中,InsertNextPoints()返回加入的點的索引號
		// 下面需要使用這個索引號來創建頂點類型的單元
		pid[0] = points->InsertNextPoint(X[i], Y[i], Z[i]);

		// 在每個座標點上分別創建一個頂點,頂點是單元(Cell)裏的一種類型
		vertices->InsertNextCell(1, pid);

	}
	// 創建vtkPolyData對象
	vtkSmartPointer<vtkPolyData> polyData =
		vtkSmartPointer<vtkPolyData>::New();

	// 指定數據集的幾何結構(由points指定)以及數據集的拓撲結構(由vertices指定)
	polyData->SetPoints(points);
	polyData->SetVerts(vertices);

	//將生成的數據集寫入到TriangleVerts.vtk文件,保存位置是工程當前目錄
	vtkSmartPointer<vtkPolyDataWriter> writer =
		vtkSmartPointer<vtkPolyDataWriter>::New();
	writer->SetFileName("TriangleVerts.vtk");
	writer->SetInputData(polyData);
	writer->Write();

	return 0;

}

/****************************************************/
/*  Examples/Chap03/3.2_TriangleGeometryLines.cpp     */
/****************************************************/

#include <vtkSmartPointer.h>
#include <vtkPoints.h>
#include <vtkLine.h>
#include <vtkPolyData.h>
#include <vtkPolyDataWriter.h>

int main(int argc, char* argv[])
{

	// 創建三個座標點
	vtkSmartPointer<vtkPoints> points =
		vtkSmartPointer<vtkPoints>::New();
	points->InsertNextPoint(1.0, 0.0, 0.0); // 返回第一個點的ID:0
	points->InsertNextPoint(0.0, 0.0, 0.0); // 返回第一個點的ID:1
	points->InsertNextPoint(0.0, 1.0, 0.0); // 返回第一個點的ID:2
	
	// 每兩個座標點之間分別創建一條線
	// SetId()的第一個參數是線段的端點ID,第二個參數是連接的點ID
	vtkSmartPointer<vtkLine> line0 =
		vtkSmartPointer<vtkLine>::New();
	line0->GetPointIds()->SetId(0, 0);
	line0->GetPointIds()->SetId(1,1);

	vtkSmartPointer<vtkLine> line1 =
		vtkSmartPointer<vtkLine>::New();
	line1->GetPointIds()->SetId(0, 1);
	line1->GetPointIds()->SetId(1, 2);

	vtkSmartPointer<vtkLine> line2 =
		vtkSmartPointer<vtkLine>::New();
	line2->GetPointIds()->SetId(0, 2);
	line2->GetPointIds()->SetId(1, 0);

	// 創建單元數組,用於存儲以上創建的線段
	vtkSmartPointer<vtkCellArray> lines =
		vtkSmartPointer<vtkCellArray>::New();
	lines->InsertNextCell(line0);
	lines->InsertNextCell(line1);
	lines->InsertNextCell(line2);

	// 創建vtkPolyData對象
	vtkSmartPointer<vtkPolyData> polyData =
		vtkSmartPointer<vtkPolyData>::New();

	// 指定數據集的幾何結構(由points指定)以及數據集的拓撲結構(由lines指定)
	polyData->SetPoints(points);
	polyData->SetVerts(lines);

	//將生成的數據集寫入到TriangleVerts.vtk文件,保存位置是工程當前目錄
	vtkSmartPointer<vtkPolyDataWriter> writer =
		vtkSmartPointer<vtkPolyDataWriter>::New();
	writer->SetFileName("TriangleLines.vtk");
	writer->SetInputData(polyData);
	writer->Write();

	return 0;

}

3.3 單元類型

數據集由一個或多個單元組成,VTK支持線性和非線性類型的單元。一系列有序的點按指定類型連接所定義的結構就是單元,單元是VTK可視化系統的基礎。

這些順序連接的點定義了單元的拓撲結構,而點的座標定義了單元的幾何結構。

單元是由單元的類型(如六面體)和構成單元的頂點列表兩部分構成的

3.3.1 線性單元

單元類型的線性與非線性的劃分主要是以插值函數爲依據的,對於線性單元,採用的是線性或者常量插值函數。

VTK單元的類型定義在vtkCellType.h文件裏,線性單元類型如下:

1)VTK_VERTEX。頂點

2)VTK_POLY_VERTEX。多頂點

3)VTK_LINE。直線

4)VTK_POLY_LINE。折線

5)VTK_TRIANGLE 三角形

5)VTK_TRIANGLE_STRIP 三角形條帶

7)VTK_QUAD。四邊形,二維的基本類型

8)VTK_PIXEL。二維的基本類型

9)VTK_POLYGON。多邊形,二維的基本類型

10)VTK_TETRA。四面體,三維的基本類型

11)VTK_HEXAHEDRON。六面體,三維的基本類型

12)VTK_VOXEL。三維的基本類型

13)VTK_WEDGE。契形,三維的基本類型

14)VTK_PYRAMID 。角椎體

15)VTK_PENTAGONAL_PRISM 。五棱柱

16)VTK_HEXAGONAL_PRISM。六角柱


 

 

3.3.2 非線性單元

3.4 屬性數據

屬性數據是與數據集的組織結構相關聯的信息。

組織結構包括幾何結構和拓撲結構,幾何結構由點數據定義,拓撲結構由單元數據定義。

屬性數據通常是與數據集的點數據或者單元數據相關聯,但有時屬性數據也可能與組成單元的某些成分相關聯,如單元數據的某條邊或某個面。

屬性數據主要用於描述數據集的屬性特徵,對數據集的可視化實質上就是對屬性數據的可視化。

VTK中,用vtkPointData類和vtkCellData類表達數據集屬性,他們是類vtkDataSetAttributes(vtkDataSetAttributes派生自vtkFieldData)的子類,構成數據集的每個點(或單元)和屬性數據之間存在一對一的關係。

3.4.1 標量數據

/****************************************************/
/*  Examples/Chap03/3.4_VTKConceptScalars.cpp     */
/****************************************************/

#include <vtkSmartPointer.h>
#include <vtkPoints.h>
#include <vtkDoubleArray.h>
#include <vtkPolyData.h>

int main(int , char* [])
{

	// 創建點集數據:包含兩個座標點
	vtkSmartPointer<vtkPoints> points =
		vtkSmartPointer<vtkPoints>::New();
	points->InsertNextPoint(0, 0, 0); // 返回第一個點的ID:0
	points->InsertNextPoint(1, 0, 0); // 返回第一個點的ID:1

	// 創建多邊形數據
	vtkSmartPointer<vtkPolyData> polyData =
		vtkSmartPointer<vtkPolyData>::New();
	polyData->SetPoints(points);
	
	// 準備加入點數據的標量值,兩個標量值分別爲1和2
	vtkSmartPointer<vtkDoubleArray> weights =
		vtkSmartPointer<vtkDoubleArray>::New();
	weights->SetNumberOfValues(2);
	weights->SetValue(0, 1);
	weights->SetValue(1, 2);

	// 先獲取多邊形數據的點數據指針,然後設置該點數據的標量屬性值
	polyData->GetPointData->SetScalars(weights);
		
	// 輸出索引號爲0的點標量值
	double weight = vtkDoubleArray::SafeDownCast(
					polyData->GetPointData->GetScalars())->GetValue(0);
	std::cout << "double weight:" << weight << std::endl;

	return 0;

}

GetPointData->SetScalars()

3.4.2 矢量數據

與物理學的矢量概念一樣,VTK的矢量數據也是指既有大小也有方向的量。

3.4.3 紋理座標

3.4.4 張量數據

3.5  不同類型的數據集

3.5.1 vtkImageData

vtkImageData類型的數據是按規則排列在矩形方格中的點和單元的集合

如果數據集的點和單元排列在平面(二維)上,則稱此數據集爲像素映射、位圖或圖像;如果排列在層疊面(三維)上,則稱爲體。

3.5.2 vtkPolyData

多邊形數據集vtkPolyData由頂點、多頂點、線、折線和三角形條帶等單元構成,多邊形數據是不規則結構的,並且多邊形數據集的單元在拓撲維度上有多種類型。

3.5.3 vtkRectilinearGrid

3.5.4 vtkStructuredGrid

3.5.5 vtkUnstructuredGrid

3.5.6 vtkUnstructuredPoints

3.6 數據的存儲與表達

3.6.1  vtkDataArray

VTK中的內存分配採用連續內存,可以快速的創建、刪除和遍歷,稱之爲數據數組(Data Array),用類vtkDataArray實現。

vtkDataArray及其子類是建立VTK數據對象的基礎。以vtkPolyData爲例,該類由幾何數據(vtkPoints)、拓撲數據(vtkCellArray)和屬性數據(vtkPointData、vtkCellData和vtkFieldData)組成,而這些數據是通過數據數組(vtkDataArray)的形式存儲。

 

3.6.2  數據對象的表達

VTK裏的數據對象是作爲vtkDataArray的數組(即數據數組的數組)實現的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章