VTK可視化管線是完成VTK應(yīng)用程序這道菜的基本步驟,VTK數(shù)據(jù)結(jié)構(gòu)就是每一道菜的基本原料
基本數(shù)據(jù)結(jié)構(gòu)
可視化數(shù)據(jù)的基本特點(diǎn):
- 離散型:點(diǎn)與點(diǎn)之間的值是不可知的撒强,要得到該值飘哨,需要通過插值的方式獲取
- 數(shù)據(jù)具有規(guī)則或不規(guī)則的結(jié)構(gòu)
對于規(guī)則的結(jié)構(gòu)數(shù)據(jù),只需要存儲起始點(diǎn)顿仇, 相鄰兩點(diǎn)之間的間隔和總數(shù)即可保存完整的信息
不規(guī)則的數(shù)據(jù)結(jié)構(gòu)在數(shù)據(jù)表達(dá)方面更加自由細(xì)致靈活 - 數(shù)據(jù)具有維度
拓?fù)渚S度
數(shù)據(jù)對象和數(shù)據(jù)集
- 數(shù)據(jù)對象
數(shù)據(jù)一般以數(shù)據(jù)對象形式表現(xiàn)
只有當(dāng)數(shù)據(jù)對象被組織冊灰姑娘一種結(jié)構(gòu)后臼闻,才能被VTK算法處理
vtkDataObject 根據(jù)具體可視化數(shù)據(jù)選用
-
數(shù)據(jù)集
vtkDataSet 將數(shù)據(jù)對象組織成一種結(jié)構(gòu)并且賦予相應(yīng)的屬性值述呐,就形成了數(shù)據(jù)集.
vtkDataSet 由拓?fù)浣Y(jié)構(gòu)和幾何結(jié)構(gòu)組成:
點(diǎn)數(shù)據(jù)定義的坐標(biāo)點(diǎn)形成了幾何結(jié)構(gòu)乓搬,點(diǎn)數(shù)據(jù)的鏈接形成單元數(shù)據(jù)进肯,由單元數(shù)據(jù)形成數(shù)據(jù)集的拓?fù)浣Y(jié)構(gòu)
-
單元
一系列有序的點(diǎn)按照指定類型連接所定義的結(jié)構(gòu)就是單元棉磨,單元是VTK的基礎(chǔ)
單元類型分為線性單元和非線性單元
- 屬性數(shù)據(jù)
主要用于描述數(shù)據(jù)集的屬性特征环形,對數(shù)據(jù)集的可視化實(shí)質(zhì)就是對屬性數(shù)據(jù)的可視化
分為標(biāo)量數(shù)據(jù)(指標(biāo)是數(shù)據(jù)的大小抬吟,最普遍的可視化數(shù)據(jù))统抬,矢量數(shù)據(jù)(有大小有方向)聪建,張量數(shù)據(jù)
數(shù)據(jù)集
vtkImageData(非常重要) :按照規(guī)則排列在矩形方格中的點(diǎn)和單元的集合 常用于醫(yī)學(xué)圖像
vtkPolyData:多邊形數(shù)據(jù)集,該類由以下數(shù)據(jù)組成,并都是通過vtkDataArray(建立VTK數(shù)據(jù)對象的基礎(chǔ))形式存儲刃鳄,使用時(shí)應(yīng)指定元組大小
- 幾何數(shù)據(jù) vtkPoints
- 拓?fù)鋽?shù)據(jù) vtkCellArray
- 屬性數(shù)據(jù) vtkPointData vtkCellData vtkFieldData
實(shí)現(xiàn)三角形:
#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkConeSource.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLight.h>
#include <vtkCamera.h>
#include <vtkActor2D.h>
#include <vtkPlaneSource.h>
#include <vtkAxesActor.h>
#include <vtkTransform.h>
#include <vtkTransformFilter.h>
#include <vtkPoints.h>
#include <vtkLine.h>
#include <vtkCellArray.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
using namespace std;
int main()
{
/// <summary>
/// 創(chuàng)建坐標(biāo)點(diǎn)叔锐,幾何數(shù)據(jù)
/// </summary>
/// <returns></returns>
vtkSmartPointer<vtkPoints> source = vtkSmartPointer<vtkPoints>::New();
source->InsertNextPoint(1.0, 0.0, 0.0);
source->InsertNextPoint(0.0, 1.0, 0.0);
source->InsertNextPoint(0.0, 0.0, 0.0);
/// <summary>
/// 連接點(diǎn)愉烙,實(shí)現(xiàn)拓?fù)浣Y(jié)構(gòu)
/// </summary>
/// <returns></returns>
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);
///創(chuàng)建單元數(shù)組
vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
lines->InsertNextCell(line0);
lines->InsertNextCell(line1);
lines->InsertNextCell(line2);
//以上數(shù)據(jù)組合成一個(gè)vtkPolyData
vtkSmartPointer<vtkPolyData> polyData =
vtkSmartPointer<vtkPolyData>::New();
polyData->SetPoints(source);
polyData->SetLines(lines);
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(polyData);
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
//vtkSmartPointer<vtkAxesActor> axesActor =
// vtkSmartPointer<vtkAxesActor>::New();
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
//renderer->AddActor(axesActor);
renderer->SetBackground(0, 0, 0);
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->ResetCamera();
renderWindow->Render();
renderWindowInteractor->Start();
return 0;
}
VTK數(shù)據(jù)的讀寫
數(shù)據(jù)的獲取方式
- 生成模型,然后處理模型數(shù)據(jù)
- 從外部存儲介質(zhì)里導(dǎo)入相關(guān)的數(shù)據(jù)文件,步驟如下:
- 實(shí)例化Reader對象
- 指定要讀取的文件名
- 調(diào)用Update()方法促使管線執(zhí)行
vtkImageData
vtkDicomImageReader用于讀取dicom圖像遂鹊,但是不支持多幀圖像 ITK封裝了GDCM對DICOM讀寫
對于序列圖像文件秉扑,可以采用SetFileNames來設(shè)置多個(gè)圖像文件名调限,由多個(gè)二維圖像組成三維