3.3 各類數據集類型
app
在VTK中數據集的類型主要按構成數據集的幾何數據和單元來劃分,主要的數據集類型包括:結構化網格數據集、非結構化網格數據集、多邊形數據集(vtkPolyData)、結構化點集(vtkStructuredPoints)、線性網格數據集、非結構化點集等幾大類,各種的表現形式以下圖所示:
spa
(VTK 用戶手冊中給出的VTK數據類型圖以下:)scala
3.3.1 多邊形數據集orm
程序代碼:對象
#include"vtkPolyData.h"索引
#include"vtkPoints.h"ci
#include"vtkCellArray.h"get
#include"vtkFloatArray.h"it
#include"vtkDoubleArray.h"io
#include "vtkIntArray.h"
#include"vtkActor.h"
#include"vtkRenderer.h"
#include"vtkRenderWindow.h"
#include"vtkCamera.h"
#include"vtkRenderWindowInteractor.h"
#include"vtkPolyDataMapper.h"
#include"vtkPointData.h"
int main()
{
int i;
//定義點在三維座標系中的座標
static float x[8][3]={{0,0,0,},{1,0,0},{1,1,0},{0,1,0},{0,0,1},{1,0,1},{1,1,1},{0,1,1}};
//定義單元(經過點的索引來表達點之間的關係,因此採用vtkIdType)
static vtkIdType pts[6][4]={{0,1,2,3},{4,5,6,7},{0,1,5,4},{1,2,6,5},{2,3,7,6},{3,0,4,7}};
vtkPolyData *cube=vtkPolyData::New();//建立數據集對象的實例
vtkPoints *points=vtkPoints ::New();//建立vtkPoints對象的實例
vtkCellArray *polys=vtkCellArray::New();
vtkFloatArray *scalars=vtkFloatArray::New();
for(i=0;i<8;i++)points->InsertPoint(i,x[i]);//將點座標插入vtkPoints對象中
for(i=0;i<6;i++)polys->InsertNextCell(4,pts[i]);//
for(i=0;i<8;i++)scalars->InsertTuple1(1,1);
cube->SetPoints(points);//爲數據集添加點,定義其幾何
points->Delete();
cube->SetPolys(polys);//爲數據集添加單元,定義其拓撲
polys->Delete();
cube->GetPointData()->SetScalars(scalars);
scalars->Delete();
vtkPolyDataMapper *cubeMapper=vtkPolyDataMapper::New();
cubeMapper->SetInput(cube);
cubeMapper->SetScalarRange(0,7);
vtkActor *cubeActor=vtkActor::New();
cubeActor->SetMapper(cubeMapper);
vtkCamera *cubeCamera=vtkCamera::New();
cubeCamera->SetPosition(1,1,1);
cubeCamera->SetFocalPoint(0,0,0);
vtkRenderer *renderer=vtkRenderer::New();
vtkRenderWindow *renWin=vtkRenderWindow::New();
renWin->AddRenderer(renderer);
vtkRenderWindowInteractor *iren=vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
renderer->AddActor(cubeActor);
renderer->SetActiveCamera(cubeCamera);
renderer->ResetCamera();
renderer->SetBackground(1,1,1);
renWin->SetSize(300,300);
renWin->Render();
iren->Start();
return 0;
}
以上代碼塊能夠分爲以下幾個部分:
一、實例化vtkPoints,建立立方體的點。
二、實例化vtkCellArray,建立立方體的單元。
3.3.2 結構化點數據集
結構化點數據集根據其表示的數據的維數分別由線單元(1D)、像素單元(2D)或體素單元(3D)組成。並且這些單元的大小形狀都是同樣的。因此數據集中的點是很是規則的排列在一塊兒,而且排列的方向是與全局x-y-z座標軸平行的。
正是因爲結構上的規則,定義一個結構化點數據集時,不須要定義全部的點和全部的單元只須要知道一個起始點的座標以及沿着三個座標軸方向上相鄰點的距離(該距離也就是單元的邊的長度),就能夠算出全部點的座標。這兩個參數經過SetOrigin()和SetSpacing()進行設置。對於單元,因爲已知單元的類型只屬於上面提到的三種中的一種,而且只有相鄰的點才能構成單元,因此只要知道每一個座標軸方向上有多少個點(nx,ny,nz)就能夠肯定全部的單元了。該參數稱爲尺寸,用方法SetDimensions()進行設置。
也是因爲結構上的規則,數據集中的點和單元能夠用一個i-j-k天然座標系來指定。數據集中共有nx*ny*nz個點,(nx-1)(ny-1),(nz-1)個單元。一個特定的點和單元能夠用三個索引i-j-k指定。相似的,一條線能夠用三個索引中的兩個指定,一個面能夠用一個索引指定。
例子代碼:
#include"vtkActor.h"
#include"vtkRenderer.h"
#include"vtkRenderWindow.h"
#include"vtkPointData.h"
#include"vtkFloatArray.h"
#include"vtkPoints.h"
#include"vtkProperty.h"
#include"vtkPolyDataMapper.h"
#include"vtkRenderWindowInteractor.h"
#include"vtkStructuredPoints.h"
#include"vtkContourFilter.h"
int main()
{
int i,j,k,kOffset,jOffset,Offset;
float s,sp,x,y,z;
// 建立結構化點數據集,下面五行代碼肯定了數據集的拓撲與幾何
vtkStructuredPoints *vol=vtkStructuredPoints::New();
vol->SetDimensions(26,26,26);
vol->SetOrigin(-0.5,-0.5,-0.5);
sp=1.0/25.0;
vol->SetSpacing(sp,sp,sp);
//建立標量屬性
vtkFloatArray *scalars=vtkFloatArray::New();
scalars->SetNumberOfTuples(26*26*26);
for(k=0;k<26;k++)
{
z=-0.5+k*sp;
kOffset=k*26*26;
for(j=0;j<26;j++)
{
y=-0.5+j*sp;
jOffset=j*26;
for(i=0;i<26;i++)
{
x=-0.5+i*sp;
s=x*x+y*y+z*z-(0.4*0.4);
Offset=i+jOffset+kOffset;
scalars->InsertTuple1(Offset,s);
}
}
}
vol->GetPointData()->SetScalars(scalars);
scalars->Delete();
//抽取標量值爲0的點所造成的面
vtkContourFilter *contour=vtkContourFilter::New ();
contour->SetInput(vol);
contour->SetValue(0,0);
vtkPolyDataMapper *volMapper=vtkPolyDataMapper::New();
volMapper->SetInputConnection(contour->GetOutputPort());
vtkActor *volActor=vtkActor::New();
volActor->SetMapper(volMapper);
volActor->GetProperty()->SetRepresentationToWireframe();
volActor->GetProperty()->SetColor(0,0,0);
vtkRenderer *renderer=vtkRenderer::New();
vtkRenderWindow *renwin=vtkRenderWindow::New();
renwin->AddRenderer(renderer);
vtkRenderWindowInteractor *iren=vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renwin);
renderer->AddActor(volActor);
renderer->SetBackground(1,1,1);
renderer->ResetCamera();
renwin->SetSize(300,300);
renwin->Render();
iren->Start();
return 0;
}
運行結果顯示:
其餘數據集略去,等有時間再看詳細的建立方法。
上面能夠查看其餘數據集的建立方法。
直接跳到3.4節。。。