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的數組(即數據數組的數組)實現的。