规则网格在拓扑结构上规则,而几何上是不规则的,如图3-2所示。规则网格常被用来进行数据分析(如流体动力学计算)。规则网格vtkStructuredGrid数据集主要有六面体(vtkHexahedral)单元或者是四边形(vtkQuad)单元组成。
创建规则网格需要指定网格的维数(定义拓扑结构)和定义x-y-z坐标的vtkPoints对象(定义几何结构)。下面代码改自VTK/Examples/DataManiulation/Cxx/SGrid.cxx。
vtkPoints points
points InsertPoint 0 0.0 0.0 0.0
…etc…
vtkStructedGrid sgrid
sgrid SetDimensions 13 11 11
sgrid SetPoints points
主要vtkPoints对象中点的个数要与网格i,j和k三个方向的维数乘积保持一致。
大多数情况下规则网格由接收vtkDataSet类型输入的filter来处理(见89页“可视化技术”)。而直接接收vtkStructuredGrid类型输入的其中一个filter是vtkStructuredGridGeometryFilter。该Filter根据其Extent变量值来提取网格中的局部点、线段或者平面(Extent是一个描述区域的六维向量( , ))。
下例中我们读取了一个规则网格数据,提取其中的三个平面,并利用相关的向量数据对平面进行Warp处理(代码取自VTK/Examples/VisualizationAlgorithms/Tcl/warpComb.tcl)。
vtkPLOT3DReader pl3d
pl3d SetXYZFileName "$VTK_DATA_ROOT/Data/combxyz.bin"
pl3d SetQFileName "$VTK_DATA_ROOT/Data/combq.bin"
pl3d SetScalarFunctionNumber 100
pl3d SetVectorFunctionNumber 202
pl3d Update
vtkStructuredGridGeometryFilter plane
plane SetInputConnection [pl3d GetOutputPort]
plane SetExtent 10 10 1 100 1 100
vtkStructuredGridGeometryFilter plane2
plane2 SetInputConnection [pl3d GetOutputPort]
plane2 SetExtent 30 30 1 100 1 100
vtkStructuredGridGeometryFilter plane3
plane3 SetInputConnection [pl3d GetOutputPort]
plane3 SetExtent 45 45 1 100 1 100
vtkAppendPolyData appendF
appendF AddInputConnection [plane GetOutputPort]
appendF AddInputConnection [plane2 GetOutputPort]
appendF AddInputConnection [plane3 GetOutputPort]
vtkWarpScalar warp
warp SetInputConnection [appendF GetOutputPort]
warp UseNormalOn
warp SetNormal 1.0 0.0 0.0
warp SetScaleFactor 2.5
vtkPolyDataNormals normals
normals SetInputConnection [warp GetOutputPort]
normals SetFeatureAngle 60
vtkPolyDataMapper planeMapper
planeMapper SetInputConnection [normals GetOutputPort]
evalplaneMapper SetScalarRange [[pl3d GetOutput] GetScalarRange]
vtkActor planeActor
planeActor SetMapper planeMapper
如图像数据一样,规则网格数据也可以进行降采样(见105页“图像数据降采样”)。vtkExtractGrid用来执行数据降采样和提取。
vtkPLOT3DReader pl3d
pl3d SetXYZFileName "$VTK_DATA_ROOT/Data/combxyz.bin"
pl3d SetQFileName "$VTK_DATA_ROOT/Data/combq.bin"
pl3d SetScalarFunctionNumber 100
pl3d SetVectorFunctionNumber 202
pl3d Update
vtkExtractGrid extract
extract SetInputConnection [pl3d GetOutputPort]
extract SetVOI 30 30 -1000 1000 -1000 1000
extract SetSampleRate 1 2 3
extract IncludeBoundaryOn
在该例子中初始规则网格(维数为57X33X25)按照(1,2,3)的采样率进行采样,生成一个维数(1,17,9)的子集。函数IncludeBoundaryOn()保证了在没有选择边界的采样操作下也将边界提取出来。
线性网格在拓扑上规则,但是在几何上半规则(如图3-2(b))。线性网格也常用于数值分析。vtkRectilinearGrid由体素(vtkVoxel)或者像素(vtkPixel)单元组成。
线性网格创建需要指定网格维数定义网格拓扑,以及三个标量数组定义x-y-z三个方向坐标来定义几何。下面代码改自VTK/Examples/DataManipulation/Cxx/RGrid.cxx。
vtkFloatArray *xCoords = vtkFloatArray::New();
for (i=0;i<47; i++) xCoords->InsertNextValue(x[i]);
vtkFloatArray*yCoords = vtkFloatArray::New();
for (i=0;i<33; i++) yCoords->InsertNextValue(y[i]);
vtkFloatArray *zCoords = vtkFloatArray::New();
for (i=0;i<44; i++) zCoords->InsertNextValue(z[i]);
vtkRectilinearGrid *rgrid =vtkRectilinearGrid::New();
rgrid->SetDimensions(47,33,44);
rgrid->SetXCoordinates(xCoords);
rgrid->SetYCoordinates(yCoords);
rgrid->SetZCoordinates(zCoords);
确保x,y,z三个方向的标量个数要与拓扑i,j,k三个方向维数保持一致。
大多数情况下线性网格由接收vtkDataSet类型输入的Filter来处理(见89页“可视化技术”)。而直接接收vtkRectilinearGrid类型输入的其中一个Filter是vtkRectilinearGridGeometryFilter。该Filter根据其Extent变量值来提取网格中的局部点、线段或者平面(Extent是一个描述区域的六维向量( , ))。
下面例子还是紧接上面代码VTK/Examples/DataManipulation/Cxx/RGrid.cxx,我们如下提取一个平面:
vtkRectilinearGridGeometryFilter *plane =
vtkRectilinearGridGeometryFilter::New();
plane->SetInput(rgrid);
plane->SetExtent(0,46, 16,16, 0,43);
不规则网格无论在拓扑上还是几何上都是不规则的(如图3-2(f))。不规则网格常用来进行数值分析(如有限元分析)。任何一中单元类型都可以用来表示不规则网格。
不规则网格定义是通过vtkPoints来定义几何,通过插入单元来定义拓扑。(下面代码取自VTK/Examples/DataManipulation/Tcl/BuildUGrid.tcl.)
vtkPoints tetraPoints
tetraPoints SetNumberOfPoints 4
tetraPoints InsertPoint 0 0 0 0
tetraPoints InsertPoint 1 1 0 0
tetraPoints InsertPoint 2 .5 1 0
tetraPoints InsertPoint 3 .5 .5 1
vtkTetra aTetra
[aTetra GetPointIds] SetId 0 0
[aTetra GetPointIds] SetId 1 1
[aTetra GetPointIds] SetId 2 2
[aTetra GetPointIds] SetId 3 3
vtkUnstructuredGrid aTetraGrid
aTetraGrid Allocate 1 1
aTetraGrid InsertNextCell [aTetra GetCellType] [aTetra GetPointIds]
aTetraGrid SetPoints tetraPoints
…insertother cells if any…
在为vtkUnstructuredGrid实例插入单元数据前,必须先执行Allocate()函数来分配空间。该函数的两个参数分别表示初始分配的数据空间大小,和需要额外内存时扩展的内存空间大小。一般情况大比较大的值会有较好的效果(因为需要较少的内存重分配操作)。
大部分情况下,不规则网格由接收vtkDataSet类型输入的Filter处理(见89页“可视化技术”)。直接接收vtkUnstructuredGrid类型输入的其中一个Filter是vtkExtractUnstructuredGrid。这个filter根据指定的点ids,单元ids和几何边界来提取局部网格(Extent参数定义一个包围盒)。下例代码取自VTK/Examples/VisualizationAlgorithms/Tcl/ExtractUGrid.tcl。
vtkDataSetReader reader
reader SetFileName "$VTK_DATA_ROOT/Data/blow.vtk"
reader SetScalarsName "thickness9"
reader SetVectorsName "displacement9"
vtkCastToConcrete castToUnstructuredGrid
castToUnstructuredGrid SetInputConnection [reader GetOutputPort]
vtkWarpVector warp
warp SetInput [castToUnstructuredGrid GetUnstructuredGridOutput]
vtkConnectivityFilter connect
connect SetInputConnection [warp GetOutputPort]
connect SetExtractionModeToSpecifiedRegions
connect AddSpecifiedRegion 0
connect AddSpecifiedRegion 1
vtkDataSetMapper moldMapper
moldMapper SetInputConnection [reader GetOutputPort]
moldMapper ScalarVisibilityOff
vtkActor moldActor
moldActorSetMapper moldMapper
[moldActor GetProperty] SetColor .2 .2 .2
[moldActor GetProperty] SetRepresentationToWireframe
vtkConnectivityFilter connect2
connect2 SetInputConnection [warp GetOutputPort]
connect2 SetExtractionModeToSpecifiedRegions
connect2 AddSpecifiedRegion 2
vtkExtractUnstructuredGrid extractGrid
extractGrid SetInputConnection [connect2 GetOutputPort]
extractGrid CellClippingOn
extractGrid SetCellMinimum 0
extractGrid SetCellMaximum 23
vtkGeometryFilter parison
parison SetInputConnection [extractGrid GetOutputPort]
vtkPolyDataNormals normals2
normals2 SetInputConnection [parison GetOutputPort]
normals2 SetFeatureAngle 60
vtkLookupTable lut
lut SetHueRange 0.0 0.66667
vtkPolyDataMapper parisonMapper
parisonMapper SetInputConnection [normals2 GetOutputPort]
parisonMapper SetLookupTable lut
parisonMapper SetScalarRange 0.12 1.0
vtkActor parisonActor
parisonActor SetMapper parisonMapper
该例中我们采用单元裁剪(利用单元id号)和一个连通Filter来提取局部网格。vtkConnectivityFilter(以及vtkPolyDataConnectivityFilter)用来提取数据中的连通部分(当单元共享点时,他们是连通的)。SetExtractionModeToSpecifiedRegions()方法设置提取哪个连通区域。连通filter默认提取最大的连通区域。也可以如该例中那样提取一个特定的区域,不过需要一些额外的实验来对应各个区域。
vtkContourGrid用来提取不规则网格的等值线。与一般的vtkContourFilter类相比,这个类更加高效。通常你并不需要直接实例化该类,因为当vtkContourFilter识别到输入数据时vtkUnstructuredGrid类型时,vtkContourFilter内部会自动创建一个vtkContourGrid实例。
以上是可视化技术概述。接下来你可能希望学习图像处理和体绘制技术。也可以参考444页“Filter总结”部分了解VTK中的Filter。
【第5章-可视化技术 翻译完毕】