VTK中的数据集类型

VTK中的数据集类型

在VTK中数据集结构描述点和像元之间的几何和拓扑关系。当我们提到数据集类型时,我们实际上指的是数据的结构,即几何和拓扑是如何定义、存储和操作的。
VTK数据模型的另一个重要特性是数据集与单元格的关系,以及单元格是隐式表示还是显式表示。单元格可以被认为是构成数据集的原子。单元格是将数据集点(x-y-z位置)拓扑组织到有序列表或连接数组中。例如,在多边形数据集(VtkPolyData)中,多边形是数据集的单元,并且每个多边形单元被表示为点(即,多边形的顶点)的有序列表。一些数据集显式地表示点和单元格(例如,vtkPolyData中的点和单元格的列表),而其他数据集隐式地表示点和单元格(例如,在vtkImageData中由其尺寸、间距和原点表示的图像)。隐式表示意味着我们不显式存储点坐标或单元连通性。相反,这些信息是根据需要派生的。
如果想对VTK的数据模型有透彻的了解,需要知道如何从数据集中获取数据,以及如何创建数据并将数据放入数据集中。这些操作取决于数据集的类型-不同的数据集有不同的选择接口方式。此外,可以在与继承层次结构对应的不同抽象级别访问数据集。例如,要获取vtkPolyData中某个点的坐标,我们可以调用超类方法GetPoint(),或者我们可以使用GetPoints()检索vtkPolyData中的点数组,然后通过ps->GetPoint()访问点坐标。这两种方法都是有效的,而且都被使用了,具体取决于具体情况。
在下面介绍的数据集类型中除了从vtkDataSet中继承的方法之外,他们分别还定义了一些方法。

图1-各种数据集类型的表示

一、vtkImageData

vtkImageData是一种具体的数据集类型,表示x-y-z轴对齐的规则点数组。vtkImageData可以表示一维数组、二维的图像、三维的体积。数据集的几何结构和拓扑都是规则的,并且都是隐式表示的。vtkImageData数据集由数据维度、点间间距和数据集的原点(即左下角)定义。如果数据集的维度是2,那么我们将vtkImageData数据集称为图像,它由vtkPixel单元类型组成。如果数据集的维度是三,那么我们将vtkImageData数据集称为卷,它由vtkVoxel单元组成。在vtkImageData中常用的方法有Get\SetExtent()、Get\SetDimensions()等。SetExtent()和SetDimensions()的区别是前者的参数是点,后者的参数是两点之间的线段?(这是我的观点)
下面有一个例子:

int *inExt = input->GetExtent();
output->SetDimensions(outDims);
output->SetSpacing(outAR);
output->SetOrigin(outOrigin);
// If output same as input, just pass data through
//
if ( outDims[0] == dims[0] && outDims[1] == dims[1] && outDims[2] == dims[2] && rate[0] == 1 && rate[1] == 1 && rate[2] == 1 )
 {
	output->GetPointData()->PassData(input->GetPointData());
	output->GetCellData()->PassData(input->GetCellData());
	vtkDebugMacro(<<"Passed data through bacause input and output are the same");
 	return;
 }
// Allocate necessary objects
outPD->CopyAllocate(pd,outSize,outSize);
outCD->CopyAllocate(cd, outSize, outSize);
sliceSize = dims[0]*dims[1];
// Traverse input data and copy point attributes to output
//
newIdx = 0;
for ( k=voi[4]; k <= voi[5]; k += rate[2] )
{
	kOffset = (k-inExt[4]) * sliceSize;
 	for ( j=voi[2]; j <= voi[3]; j += rate[1] )
 	{
 		jOffset = (j-inExt[2]) * dims[0];
		 for ( i=voi[0]; i <= voi[1]; i += rate[0] )
 		{
 			idx = (i-inExt[0]) + jOffset + kOffset;
 			outPD->CopyData(pd, idx, newIdx++);
 		}
 	}
}

在这个取自过滤器 vtkExtractVOI 的示例中,我们对输入数据进行二次采样以生成输出数据。在滤波器的初始部分(未显示),确定并设置输出的尺寸、间距和原点。然后,配置输出并复制关联的点属性数据。

Rectilinear Grids

vtkRecti LinearGrid 是一个具体的数据集,表示排列在拓扑规则和几何半规则点数组上的信息。这些点由包含 x、y 和 z 轴坐标值的三个向量定义,因此这些点是轴对齐的并且仅部分表示。组成 vtkRectilinearGrid 的单元格是隐式表示的,并且类型为 vtkVoxel (3D) 或 vtkPixel (2D)。

Point Sets

vtkPointSet 是那些显式表示点的类(即 vtkPolyData、vtkStructuredGrid、vtkUnstructuredGrid)的抽象超类。 vtkPointSet 的基本功能是实现访问或操作点的 vtkDataSet 方法(例如 GetPoint() 或 FindPoint())。
下面是一个使用 vtkPointSet API 的过滤器示例。以下代码执行类 vtkWarpVector 定义的操作。 (注意:vtkWarpVector 已针对性能进行了模板化。)

inPts = input->GetPoints();
pd = input->GetPointData();
if ( !pd->GetVectors() || !inPts )
{
	vtkErrorMacro(<<"No input data");
	return;
}
inVectors = pd->GetVectors();
numPts = inPts->GetNumberOfPoints();
newPts = vtkPoints::New();
newPts->SetNumberOfPoints(numPts);
// Loop over all points, adjusting locations
for (ptId=0; ptId < numPts; ptId++)
{
	x = inPts->GetPoint(ptId);
	v = inVectors->GetTuple(ptId);
 	for (i=0; i<3; i++)
 	{
 		newX[i] = x[i] + this->ScaleFactor * v[i];
 	}
	 newPts->SetPoint(ptId, newX);
}

Structured Grids

vtkStructuredGrid 是一个具体的数据集,表示排列在拓扑规则但几何不规则的点数组上的信息。这些单元的类型为 vtkHexahedron(在 3D 中)和 vtkQuad 类型(在 2D 中),并使用 Dimensions 实例变量隐式表示。这些点由超类 vtkPointSet 显式表示。vtkStructuredGrid 的大部分方法都是从其超类 vtkPointSet 和 vtkDataSet 继承的。

Polygonal Data

vtkPolyData 是一种具体的数据集类型,表示渲染图元,例如顶点、直线、多边形和三角形带。数据是完全非结构化的:点在超类 vtkPointSet 中表示,单元使用 vtkCellArray 的四个实例表示。四个vtkCellArray代表顶点和多顶点;线和折线;三角形、四边形和多边形;和三角形带。
由于 vtkPolyData 是非结构化的,因此必须显式表示单元和点。为了支持其超类vtkDataSet所需的一些方法(主要是拓扑方法,如GetPointCells()和GetCellNeighbors()),vtkPolyData具有复杂的内部数据结构。除了 vtkPoints 和 vtkCellArrays 之外,数据结构还包含单元类型列表 (vtkCellTypes) 和单元链接 (vtkCellLinks)。单元类型数组允许随机访问单元。这是必要的,因为 vtkCellArray 无法支持随机访问,因为各个单元的大小可能不同。单元链接数组通过维护对使用特定顶点的所有单元的引用来支持拓扑操作。这两个类(vtkCellTypes 和 vtkCellLinks)的实例仅在需要时才实例化。即如果需要随机访问cell则实例化vtkCellTypes;或者如果需要拓扑信息,则实例化 vtkCellLinks。

在这里插入图片描述
虽然此结构相当复杂,但好消息是,大多数情况下,内部结构的管理都会为您处理。通常,只要使用 vtkDataSet 的 API 来接口信息,您就不需要直接操作结构。在某些情况下,编写过滤器或使用某些 vtkPolyData 或 vtkUnstructedGrid 方法,您可能必须使用 BuildCells() 和 BuildLinks() 方法显式创建单元格类型和/或单元格链接数组。在极少数情况下,您可能希望直接操作结构 - 删除点或单元,和/或修改链接数组以反映不断变化的拓扑。

Unstructured Grids

vtkUnstructedGrid 是一种具体的数据集类型,表示 VTK 单元格的所有可能组合(即图1 中显示的所有组合)。数据完全是非结构化的。点由超类 vtkPointSet 表示,单元由 vtkCellArray、vtkCellTypes 和 vtkCellLinks 等对象的组合表示。通常,这些对象(不包括 vtkPoints)在内部使用,不直接操作它们。
尽管 vtkUnstructedGrid 和 vtkPolyData 很相似,但也存在实质性差异,vtkPolyData 只能表示拓扑维度为 2 或更少的单元(即三角带、多边形、线、顶点),而 vtkUnstructedGrid 可以表示维度为 3 或更少的单元。此外,vtkUnstructedGrid 维护 vtkCellTypes 的内部实例以允许对其单元格进行随机访问,而 vtkPolyData 仅在需要随机访问时实例化 vtkCellTypes。最后,vtkUnstructedGrid 维护 vtkCellArray 的单个内部实例来表示单元连接性; vtkPolyData维护了四个数组,分别对应三角形带、多边形、直线和顶点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值