vtk用户指南 第十六章 与VTK数据对象的接口

        在本节中,我们提供描述VTK中许多数据对象的接口的详细信息。这包括从数据集(由可视化管道中的过滤器对象处理)到数据数组(用于表示数据集的一部分(例如,标量数据))。
为了理解VTK中数据对象之间的关系,请参见图19-1 ~图19-5所示的图表。

16.1数据阵列

        在超类vtkDataArray及其许多子类中实现的数据数组是许多VTK数据对象构建的基础。例如,vtkPolyData, VTK用来表示多边形图形数据的数据结构,包含存储几何(在vtkPoints),拓扑(在vtkCellArray)和属性(在vtkField, vtkPointData和vtkCellData)信息的数据数组。为了操作VTK数据对象,学习如何操作vtkdataarray是至关重要的。vtkdataarray主要用于存储数字信息,并且总是用于存储非异构的信息。它们还假定将存储在数组中的信息内容不是稀疏的。VTK还提供了vtkAbstractArrays (vtkDataArray的超类)和vtkArrays(参考章节12.16 vtkArray),用于处理不那么严格定义的内容。数据数组从其vtkAbstractArray超类继承了一个基于元组抽象的接口如图16-1所示。数据数组能够通过动态分配来管理内部内存,同时也提供基于原始指针的对其内容的访问以提高效率。在元组抽象中,vtkDataArray将数据表示为元组数组,每个元组由相同数量的组件组成,每个组件具有相同的本机数据类型。在实现中,元组实际上是连续数据数组中的子数组,如图所示。数据数组和元组抽象的强大之处在于,数据可以用本机类型表示,而可视化数据可以用元组表示。例如,我们可以通过创建元组大小(即组件数量)等于3的vtkFloatArray (vtkDataArray的子类)来表示本机类型float的矢量数据。在这种情况下,向量的数量就是元组的数量;或者,float值的数量除以组件的数量(对于矢量,组件的数量总是3)。

vtkDataArray方法

下面是vtkDataArray方法的总结。请注意,这些是vtkDataArray的所有子类所需的方法;每个子类都有几个专门的其他方法。一个子类vtkFloatArray的特殊方法(主要处理指针和数据特定信息)紧随vtkDataArray方法摘要显示。

dataArray = NewInstance()

创建一个与当前数据数组类型相同的实例(dataArray)。也称为“虚拟”构造函数。

type = GetDataType()

返回数据的原生类型为整数令牌(令牌在vtkType.h中定义)。可能的类型有VTK_VOID, VTK_BIT, VTK_CHAR, VTK_SIGNED_CHAR, VTK_UNSIGNED_CHAR, VTK_SHORT, VTK_UNSIGNED_SHORT, VTK_INT, VTK_UNSIGNED_INT, VTK_LONG, VTK_UNSIGNED_LONG, VTK_LONG_LONG, VTK_UNSIGNED_LONG_LONG, VTK___INT64, VTK_UNSIGNED___INT64, VTK_FLOAT, VTK_DOUBLE, and VTK_ID_TYPE.

size = GetDataTypeSize()

返回底层数据类型的大小。VTK_BIT返回1。

size = GetDataType(type)

返回指定数据类型的大小。VTK_BIT返回1。

SetNumberOfComponents(numComp)

指定每个元组的组件数量。

GetNumberOfComponents()

获取每个元组的组件数

SetNumberOfTuples(number)

设置数据数组中元组的个数。该方法分配存储,并依赖于事先调用SetNumberOfComponents()方法来进行适当的分配。

numTuples = GetNumberOfTuples()

返回数据数组中元组的个数。

tuple = GetTuple(i)

返回一个指向数组的指针,该数组表示数据数组中的特定元组。这方法不是线程安全的,数据可能被强制转换为通用类型(即double类型)。

GetTuple(i, tuple)

用数据填充用户提供的元组(先前分配的)。给定一个id(索引)列表,返回用户提供的输出数组中对应的元组数组。输出数组必须(由用户)为数据分配足够的内存。

GetTuples(id1, id2, output)

用指定的id(索引)范围(id1到id2,包括在内)的元组填充用户提供的输出数组。输出数组必须(由用户)为数据分配足够的内存。

SetTuple(i, tuple)

指定位于数组位置i的元组。此方法不进行范围检查,并且比其他方法(例如InsertTuple())更快。在使用此方法插入数据之前,必须调用SetNumberOfTuples()。

InsertTuple(i, tuple)

在元组位置i插入数据。此方法执行范围检查,并在必要时分配内存。

i = InsertNextTuple(tuple)

在数据数组的末尾插入数据,并返回其在数组中的位置。此方法执行范围检查,并在必要时分配内存。c = GetComponent(i, j)获取元组位置i和组件j(第i个元组)的组件值为double。

SetComponent(i, j, c)

设置元组位置i的第j个组件值。此方法不执行范围检查,您必须事先使用SetNumberOfTuples()方法分配内存。

InsertComponent(i, j, c)

在元组位置i插入第j个组件值。此方法执行范围检查并根据需要分配内存。

FillComponent(j, c)

用所有元组的指定值(c)填充数据数组的第j个元素。这可以用来初始化多组件数组中的单个组件。

CopyComponent(j, array, c)

用数组第c个元素的值填充数据数组的第j个元素。这可以用于将组件(列)从一个数据数组复制到另一个数据数组。

GetData(tupleMin, tupleMax, compMin, compMax, data)

提取一个矩形数组的数据(into data)。必须预先分配数组数据。矩形是根据组件和元组的最小和最大范围定义的。

DeepCopy(dataArray)

对另一个对象执行深度拷贝。深度复制意味着数据实际上是复制的,而不是引用计数。

ptr = GetVoidPointer(id)

返回一个指向数据的指针,作为void *指针。这可以与GetDataType()方法一起使用,将数据转换为适当的类型或转换为适当的类型。

ptr = WriteVoidPointer(id, number)

为从位置id开始的数字写入准备数组。返回特定数据索引(id)的地址。确保内存分配给数字项。根据请求值的数量设置MaxId实例变量。

Allocate(size)

为这个数组分配内存。回收数据数组可能分配的任何未使用的内存。此方法通常在使用Insert()方法时使用,并且不能精确指定初始分配时的数据量。

Resize(numTuples)

将数组的大小调整为numTuples指定的大小。数组中包含的任何数据都将被保留。

Reset()

修改数据数组,使其看起来为空,但保留已分配的存储空间。有助于避免过度分配和重新分配。

size = GetSize()

返回数组的大小(元素个数)。

Initialize()

将数据数组重置为初始状态并释放已分配的存储空间。

CreateDefaultLookupTable()

如果没有指定查找表,而需要查找表,则创建一个默认表。

SetLookupTable(lut)

指定一个查找表,用于将数组值映射到颜色。

lut = GetLookupTable()

返回用于将数组值映射到颜色的查找表。给定一个id列表,用与这些id相对应的元组填充用户提供的数组。例如,id可能是定义单元格的id,返回列表包含点标量。

id = GetMaxId()

返回当前数组中的最大id(元素数- 1)。

SetVoidArray(array, size, save)

从外部源直接设置数据数组(指定为void*)。当您与数据接口并希望将数据传递到VTK的管道时,此方法非常有用。保存标志指示在数据数组被销毁时是否应该删除传入的数组。值为1表示VTK在使用完数据数组后不应该删除它。

ExportToVoidPointer(ptr)

将数据数组复制到用户指定的空指针。为void指针分配足够的内存是用户的责任。

sz = GetActualMemorySize()

返回该数据数组使用的内存(以千字节为单位)。

SetName(name)

指定数据数组的名称。

name = GetName()

返回数据数组名称。

ComputeRange(comp)

确定数据数组的指定组件(comp)中包含的值的范围。

range = GetRange(i)

返回第i个分量的范围(min,max)。此方法不是线程安全的。

GetRange(range, i)

填写用户提供的数组中第i个元素的最小/最大值。

range = GetRange()

返回第0个分量的范围(min, max)。此方法不是线程安全的。

GetRange(range)

填写用户提供的数组中第0个元素的最小/最大值。

GetDataTypeRange(range)

填写可以使用底层数据类型指定的最小/最大值。

GetDataTypeRange(type, range)

填写可以使用type所指示的数据类型指定的最小/最大值。

min = GetDataTypeMin()

返回可以使用底层数据类型指定的最小值。

min = GetDataTypeMin(type)

返回type所指定的数据类型所能指定的最小值。

max = GetDataTypeMax()

返回可以使用底层数据类型指定的最大值。

max = GetDataTypeMax(type)

返回type所指定的数据类型所能指定的最大值。

norm = GetMaxNorm()

返回所有元组的最大规范值。每次调用GetMaxNorm()时都会计算这个值。

array = CreateDataArray(type)

创建指定数据类型的array。用户负责删除返回的数据数组。以下方法来自vtkFloatArray,它是vtkDataArray的子类。请注意,超类vtkDataArray及其具体子类的可用功能之间存在重叠。这是因为超类提供了一些对快速/紧凑编码有用的泛型功能,而子类允许您直接获取数据,可以通过指针操作和/或模板化函数对其进行操作。

v = GetValue(i)

返回数组中第i个数据位置的值。

SetNumberOfValues(number)

设置数组中值的个数。这个方法执行内存分配。

SetValue(i, value)

设置数组中第i个数据位置的值。此方法需要事先调用SetNumberOfValues()或WritePointer()。该方法比插入方法快,因为不执行范围检查。

InsertValue(i, f)

插入数组中第i个数据位置的值。此方法执行范围检查并根据需要分配内存。

id = InsertNextValue(f)

在数据数组末尾插入值f,并返回其在数组中的位置。此方法执行范围检查,并在必要时分配内存。

void GetTupleValue(i, tuple)

复制第i个元组到用户提供的数组中。

SetTupleValue(i, tuple)

将元组设置在数据数组的第i个位置。

InsertTupleValue(i, tuple)

将元组插入到数据数组的第i个位置。必要时执行内存分配。

InsertNextTupleValue(tuple)

在数据数组的末尾插入元组。必要时执行内存分配。

ptr = GetPointer(i)

返回指向数据数组的指针。指针从第i个数据位置返回(通常i=0,该方法返回数组开头的指针)。

ptr = WritePointer(i, number)

分配内存并为从数据位置i开始的数字直接写准备数组。返回一个从数据位置i开始的指针。

SetArray(array, size, save)

从外部源直接设置数据数组。当您与数据接口并希望将数据传递到VTK的管道时,此方法非常有用。保存标志指示在数据数组被销毁时是否应该删除传入的数组。一个值1表示VTK在使用完数据数组后不应该删除它。

16.2数据集

        通常情况下,编写过滤器最困难的部分是与VTK数据对象的接口。作为过滤器开发人员,您很可能非常熟悉该算法。学习如何操作VTK数据集——读取输入并创建输出——是编写一个高效、健壮和有用的过滤器的关键。学习如何操作数据集的最重要的一步可能是理解数据模型。图16-2总结了VTK的数据集类型。如果您不熟悉这些对象,您需要阅读The Visualization Toolkit文本,和/或花一些时间阅读代码以理解数据模型。下面的段落将重点介绍数据模型的一些重要特性。

        VTK数据模型的一个重要方面是数据集的结构和数据属性之间的关系。vtkDataSet是vtkDataObject的子类。这两个类之间的区别在于,数据对象表示完全任意的数据(请参阅第25页的“可视化管道”),而数据集表示具有固有空间结构的数据。几个vtkDataObject类型不是vtkDataSet,包括vtkSelection, vtkGraph和vtkTable在本章后面描述。然后,数据集结构描述点和单元之间的几何和拓扑关系。

        当我们提到数据集类型时,我们实际上指的是数据的结构,即几何和拓扑是如何定义、存储和操作的。这个空间结构是数据集属性附加到的框架。而vtkDataObject将包含vtkFieldData的一个实例中的信息,vtkDataSet有三个实例。一个用于数据集范围内的通用信息,一个用于与每个点关联的值,最后一个用于与每个单元关联的值。这些与点和单元相关的值被称为数据集属性,并存储标量、向量、张量、法线、纹理坐标和id等信息。无论数据集的类型如何,这些拓扑和几何上相关的数据属性都以相同的方式创建和操作。

        VTK数据模型的另一个重要特征是数据集与单元格的关系,以及单元格是隐式表示还是显式表示。细胞可以被认为是组成数据集的原子。单元格是将数据集点(x-y-z位置)拓扑组织成有序列表或连通性数组。例如,在多边形数据集(vtkPolyData)中,多边形是数据集的单元格,每个多边形单元格表示为一个有序的点列表(即多边形的顶点)。一些数据集显式地表示点和单元格(例如,vtkPolyData中的点和单元格列表),而其他数据集则隐式地表示点和单元格(例如,vtkImageData中由其尺寸,间距和原点表示的图像)。隐式表示意味着我们不显式地存储点坐标或单元连接。相反,这些信息是在必要时导出的。您可能希望参考图19-20来查看VTK中的单元格类型。

        假设您对VTK的数据模型有了透彻的了解,您需要知道如何从数据集中获取数据,以及如何创建数据并将数据放入数据集中。这些活动依赖于数据的类型——不同的数据集有不同的首选接口方式。此外,可以在与继承层次结构相对应的不同抽象级别访问数据集。例如,要获得vtkPolyData中点的坐标,我们可以调用超类方法vtkDataSet::GetPoint(),或者我们可以使用pts=vtkPolyData::GetPoints()检索vtkPolyData中的点数组,然后通过pts->GetPoint()访问点坐标。这两种方法都是有效的,并且根据具体情况都可以使用。作为过滤器编写者,您必须确定与数据集交互的正确抽象级别。

注意:为了获得最快的访问速度,您可以获取指向points数组的指针,然后使用模板化方法来处理数据。例如:

void *ptr = pts->GetData()->GetVoidPointer(0);
switch (pts->GetData()->GetDataType())

case VTK_FLOAT:
float *fptr = static_cast<float*>ptr;
...etc...
}

        下一节将总结如何操作各种类型的数据集。如果要编写过滤器,就需要这些信息。一旦理解了vtkDataSet的接口,图形过滤器的实际构造就相对简单了。在阅读本文时,您可能希望参考一下继承层次结构(图19-4)。每个数据集的汇总信息分为三个部分:

1。数据集的一般描述,2。

2 .创建、操作和从数据集中提取信息的方法;

3.一个或多个演示重要概念的例子。

        vtkDataSet是一个抽象数据集类型。vtkDataSet的存在是为了定义一组访问方法,它的所有具体的数据集子类都继承这些方法。抽象对象是指一般情况下的具体对象,具体的具体类型是未知的或不重要的。注意,抽象对象不能(直接)实例化。

        因此,通常的做法是使用vtkDataSet的NewInstance()方法来创建一个给定已有vtkDataSet对象的具体类的新实例。几乎总是在CopyStructure()方法之后,该方法复制数据集的几何和拓扑结构。(您可能也希望复制数据集属性,请参阅第362页的“字段和属性数据”以获取更多信息。)

vtkDataSet方法

在实践中,vtkDataSet定义的访问器方法在操作任何类型数据集的一般过滤器中使用,而不考虑其特定的结构特征。以下方法可以在任何vtkDataSet子类上调用。

dataSet = NewInstance()

创建一个与当前数据集相同类型的实例。也称为“虚拟”构造函数。

CopyStructure(dataSet)

使用提供的数据集更新当前结构定义(即几何和拓扑)。注意,复制是使用引用计数完成的。

type = GetDataObjectType()

返回数据对象的类型(例如,vtkDataObject, vtkPolyData, vtkImageData, vtkStructuredGrid, vtklineargrid,或vtkUnstructuredGrid)。

numPoints = GetNumberOfPoints()

返回数据集中的点数。

numCells = GetNumberOfCells()

返回数据集中的单元格数。给定一个点id,返回一个指向该点(x,y,z)坐标的指针。

给定一个点id,将该点的(x,y,z)坐标复制到提供的数组x中。这是前一种方法的线程安全变体。给定一个cell id,返回一个指向cell对象的指针。给定单元格id,返回用户提供的vtkGenericCell类型实例中的一个单元格。这是前面GetCell()方法的线程安全变体。

type = GetCellType(celllid)

返回cell id给出的cell类型。该类型是在包含文件vtkCellType.h中定义的整数标志。生成组成数据集的单元格类型列表(在types中提供)。给定一个点id,返回使用该点的单元格列表。给定一个单元格id,返回定义该单元格的点id(例如连通性列表)。给定一个单元格id和一个组成单元格边界面或边缘的点列表,返回该单元格共享这些点的邻居。

pointId = FindPoint(x)

定位到全局坐标x最近的点。返回最近的点,如果点x在数据集之外则返回-1。

FindCell(x, cell, celllid, tol2, subId, pcods, weights)

给定一个座标值x,一个由cell和celllid定义的初始搜索单元格,以及一个公差度量(平方),返回包含点及其插值函数权重的单元格的单元格id和子id。初始搜索单元格(如果celllid &gt;=0)用于在已知位置x靠近单元格时加快搜索过程。如果没有找到单元格,则查找cellid &lt;返回0。

foundCellId = FindCell(x, cell, genericCell, celllid, tol2, subIc, pcods, weights)

与之前相同,但用户提供的vtkGenericCell实例用于对GetCell()的任何内部调用。

cell = FindAndGetCell(x, cell, cellId, tol2, subId, pcods, weights)

这是前一个方法(FindCell())的一个变体,它返回一个指向单元格的指针,而不是单元格id。

pointData = GetPointData()

返回一个指向维护点属性数据的对象的指针。这包括标量、向量、法线、张量、纹理坐标和场数据。

cellData = GetCellData

返回一个指向维护单元格属性数据的对象的指针。这包括标量、向量、法线、张量、纹理坐标和场数据。

bounds = GetBounds()

获取数据集的边界框。返回值是一个数组(xmin, xmax, ymin, ymax, zmin, zmax)。GetBounds(bounds)获取数据集的边界框。返回值是一个数组(xmin, xmax, ymin, ymax, zmin, zmax)。这是前一种方法的线程安全变体。

length = GetLength()

返回数据集边界框对角线的长度。

center = GetCenter()

获取数据集边界框的中心。

GetCenter(center)

获取数据集边界框的中心。这是前一种方法的线程安全变体。

range = GetScalarRange()

返回与数据集关联的标量属性数据的(最小、最大)范围的方便方法。

GetScalarRange(range)

前一个方法的线程安全变体。

Squeeze()

回收任何用于存储数据的额外内存。通常在创建数据并将数据插入数据集之后使用。

GetCellBounds(celllid, bounds)

在用户提供的数组中存储具有给定celllid的单元格的边界。

ComputeBounds()

确定数据集的边界框。

Initialize()

将数据集返回到初始状态。

size = GetMaxCellSize()

返回数据集中最大单元格的大小(由单元格中的点数定义)。

size = GetActualMemorySize()

返回数据集的大小,单位为千字节。

ShallowCopy(src)

使用引用计数将src数据集复制到此数据集。

DeepCopy(src)

将src数据集复制到此数据集,生成数据的第二次副本。

mismatch = CheckAttributes()

检查单元格和点属性数组的长度是否匹配

几何中的点/单元。如果不匹配,返回1;否则返回0。
GenerateGhostLevelArray ()
此方法为给定数据集的点计算幽灵数组。

vtkDataSet例子

下面是使用vtkDataSet API的一个典型示例。代码片段是从vtkProbeFilter修改的。vtkProbeFilter从一个数据集采样数据属性值到另一个数据集的点(过滤器有两个输入)。请暂时忽略对点数据属性的引用;这些方法将在第362页的“字段和属性数据”中解释。

numPts = input->GetNumberOfPoints();
pd = source->GetPointData();
// Allocate storage for output PointData
outPD = output->GetPointData();
outPD->InterpolateAllocate(pd);
// Use tolerance as a function of size of source data
tol2 = source->GetLength();
tol2 = tol2*tol2 / 1000.0;
// Loop over all input points, interpolating source data
for (ptId=0; ptId < numPts; ptId++)
{
// Get the xyz coordinate of the point in the input dataset
x = input->GetPoint(ptId);
// Find the cell that contains xyz and get it
cell = source->FindAndGetCell(x,NULL,
-1,tol2,subId,pcoords,weights);
if (cell)
{
// Interpolate the point data
outPD->InterpolatePoint(pd,ptId,
cell->PointIds,weights);
}
else
{
outPD->NullPoint(ptId);
}
}
 delete [] weights;

下面的示例展示了如何使用vtkDataSet API创建数据集的引用计数副本。变量newDataSet和dataSet都是指向vtkDataSet的指针。

newDataSet = dataSet->NewInstance();
newDataSet->CopyStructure(dataSet);
newDataSet->GetPointData()->
PassData(dataSet->GetPointData());
newDataSet->GetCellData()->
PassData(dataSet->GetCellData());

现在我们已经介绍了vtkDataSet的抽象API,接下来我们来看看具体的数据集类型。
记住,每个具体子类都继承其超类的方法,包括vtkDataSet。

16.3图像数据

vtkImageData是一个具体的数据集类型,表示一个规则的,x-y-z轴对齐的点数组。vtkImageData可以表示1D阵列、2D图像和3D卷。数据集结构的几何和拓扑都是规则的,并且都是隐式表示的。vtkImageData数据集由数据维度、点间距和数据集的原点(即左下角)定义。如果数据集的维度是2,那么我们称vtkImageData数据集为图像,它由vtkPixel单元格类型组成。如果数据集的维度是3,那么我们称vtkImageData数据集为一个体积,它由vtkVoxel单元组成。

vtkImageData方法

SetExtent(x1, x2, y1, y2, z1, z2)

设置图像数据集的范围。在每个轴上,范围由第一个点的索引和最后一个点的索引定义。

SetExtent(extent)

前一个方法的替代方法,其中extent是大小为6的整数数组。

ext = GetExtent()

返回一个指向大小为6的整数数组的指针,其中包含图像数据集的范围(xmin, xmax, ymin, ymax, zmin, zmax) GetExtent(ext)是前一种方法的线程安全替代方法。

SetDimensions(i, j, k)

设置图像数据集的维度,以点的个数来表示,而不是以单元格的个数来表示。这是数据从0,0,0开始的常见情况的简写,相当于SetExtent(0, i- 1,0, j- 1,0, k-1)。

SetDimensions(dim)

前一个方法的替代形式,其中dim是一个大小为3的数组。

dims = GetDimensions()

返回一个指向大小为3的数组的指针,该数组包含图像数据集的i-j-k个维度。先前方法的线程安全形式。

SetSpacing(sx, sy, sz)

设置图像数据集的间距。

SetSpacing(spacing)

前一种方法的另一种形式,其中spacing是大小为3的数组。

spacing = GetSpacing()

返回一个指向大小为3的数组的指针,其中包含数据集的间距。

GetSpacing(spacing)

前一个方法的线程安全形式。

SetOrigin(x, y, z)

设置图像数据集的原点。

SetOrigin(origin)

上一个方法的替代形式,其中origin是大小为3的数组。

origin = GetOrigin()

返回一个指向大小为3的数组的指针,该数组包含图像数据集的原点。前一个方法的线程安全形式。给定三维建模坐标系中的点x,确定结构化坐标i-j-k,指定该点在哪个单元格中,以及单元格内的参数坐标。

GetVoxelGradient(i, j, k, scalars, gradient)

给定一个由i-j-k结构坐标指定的单元格,以及图像数据集的标量数据,计算定义体素的8个点上的梯度。给定一个由i-j-k结构化坐标指定的点,以及图像数据集的标量数据,计算该点(大小为3的数组)的梯度。

d = GetDataDimension()

返回数据集(0,3)的维数。

pointId = ComputePointId(int ijk[3])

给定一个由i-j-k结构化坐标指定的点,返回点id。

celllid = ComputeCellId(int ijk[3])

给定一个由i-j-k结构化坐标指定的单元格,返回该点的单元格id。

size = GetEstimatedMemorySize()

返回vtkImageData数据集的估计内存大小,单位为千字节。

vtkImageData例子

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

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++);
 }
 }
 }

16.4直线网格

        vtklineargrid是一个具体的数据集,它表示排列在拓扑规则和几何半规则点阵列上的信息。这些点由包含x、y和z轴的坐标值的三个向量定义,因此这些点与轴对齐,并且仅部分表示。构成vtklineargrid的单元格是隐式表示的,类型是vtkVoxel (3D)或vtkPixel (2D)。创建vtklineargrid需要指定数据集维度和三个定义x, y, z方向坐标的数组。(这些数组由XCoordinates表示,YCoordinates和ZCoordinates实例变量)。确保坐标值的数量与指定的尺寸一致。

vtkRectilinearGrid方法

类vtklineargrid定义了几个方法,超出了从vtkDataSet继承的方法。

settextent (x1, x2, y1, y2, z1, z2)

设置vtklineargrid数据集的范围。在每个轴上,范围由第一个点的索引和最后一个点的索引定义。注意,范围必须匹配在XCoordinates、YCoordinates和ZCoordinates数组中找到的值的数量。

SetExtent(extent)

前一个方法的替代方法,其中extent是大小为6的整数数组。返回一个指向大小为6的整数数组的指针,该数组包含vtklineargrid数据集的范围(xmin, xmax, ymin, ymax, zmin, zmax)。

GetExtent(extent)

前一种方法的线程安全替代方法。

SetDimensions(i, j, k)

设置直线网格数据集的维度。这是数据从0,0,0开始的常见情况的简写,相当于SetExtent (0, i- 1,0, j- 1,0, k-1)。

SetDimensions(dim)

前面方法的另一种形式,其中dim是一个大小为3的数组。

dims = GetDimensions()

返回一个指向大小为3的数组的指针,该数组包含数据集的i-j-k维数。先前方法的线程安全形式。给定3D建模坐标系中的一个点,确定结构化坐标i-j-k,指定该点在哪个单元格中,以及单元格内的参数坐标。

d = GetDataDimension()

返回数据集(0,3)的维数。

pointId = ComputePointId(int ijk[3])

给定一个由i-j-k结构化坐标指定的点,返回该点的点id。

celllid = ComputeCellId(int ijk[3])

给定一个由i-j-k结构坐标指定的单元格,返回该单元格的单元格id。

SetXCoordinates(xcoords)

指定定义x坐标值的值数组。数组xcoord的类型为vtkDataArray。

SetYCoordinates (ycoords)

指定定义y坐标值的值数组。数组数组类型为vtkDataArray。

SetZCoordinates(zcoordinates)

指定定义z坐标值的值数组。数组zcoordinates的类型为vtkDataArray。

xCoord = GetXCoordinates()

获取指定定义x坐标值的vtkDataArray。

GetXCoordinates(xCoord)

一个线程安全的替代方法。

yCoord = GetYCoordinates()

获取指定定义y坐标值的vtkDataArray。

GetYCoordinates(yCoord)

是前一个方法的线程安全替代方法。

zCoord = GetZCoordinates()

获取指定定义z坐标值的vtkDataArray。

GetZCoordinates(zCoord)

是前一种方法的线程安全替代方法。

16.5点集

vtkPointSet是显式表示点的类的抽象超类(即,vtkPolyData, vtkStructuredGrid, vtkUnstructuredGrid)。vtkPointSet的基本功能是实现那些访问或操纵点。

vtkDataSet方法

(例如,GetPoint()或FindPoint())。有几个访问方法定义,但大多数重载vtkDataSet的API。注意,因为这个对象是抽象的,所以没有直接的创建方法。参考vtkDataSet::NewInstance()创建方法(更多信息参见第335页的“vtkDataSet Methods”)。

points = GetPoints()

返回指向vtkPoints类型对象的指针。这个类显式地表示数据集中的点。

SetPoints(points)

指定该对象的显式点表示。参数points是vtkPoints的一个实例。

下面是一个过滤器的例子,练习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);
 }

要关注的方法是vtkPointSet::GetPoints(),它返回一个指向vtkPoints实例的指针
(inPts)。另外,请注意,我们使用调用vtkPoints::GetPoint()来返回特定点的点坐标。我们可以用vtkPointSet::GetPoint()代替这个调用,并获得相同的结果。

16.6结构化网格

        vtkStructuredGrid是一个具体的数据集,它表示排列在拓扑规则但几何不规则的点阵列上的信息。单元格的类型为vthexahedron (3D)和vtkQuad (2D),并使用Dimensions实例变量隐式表示。这些点由超类vtkPointSet显式表示。

vtkStructuredGrid方法

大多数vtkStructuredGrid的方法是从它的超类vtkPointSet和vtkDataSet继承的。

settextent (x1, x2, y1, y2, z1, z2)

设置vtkStructuredGrid数据集的范围。在每个轴上,范围由第一个点的索引和最后一个点的索引定义。

SetExtent(extent)

前一个方法的替代方法,其中extent是大小为6的整数数组。

ext = GetExtent()

返回一个指向大小为6的整数数组的指针,该数组包含vtkStructuredGrid数据集的范围(xmin, xmax, ymin, ymax, zmin, zmax)。

GetExtent(ext)

前一种方法的线程安全替代方法。

SetDimensions(i, j, k)

指定结构化网格的i-j-k个维度。由乘积i*j*k指定的网格的点数必须与vtkPointSet::GetNumberOfPoints()返回的点数相匹配。这是数据从0,0,0开始的常见情况的简写,相当于SetExtent(0, i- 1,0, j- 1,0, k-1)。

SetDimensions(dim)

前一种方法的替代形式。维度是用一个包含三个整数值的数组指定的。

dims = GetDimensions()

返回一个指向大小为3的数组的指针,其中包含数据集的i-j-k个维度。前一个方法的线程安全形式。

dim = GetDataDimension()

返回数据集的维度,即数据集是0、1、2还是3维。

16.7多边形数据

        vtkPolyData是一个具体的数据集类型,它表示渲染原语,如顶点、线条、多边形和三角形带。数据是完全非结构化的:点在超类vtkPointSet中表示,单元格使用vtkCellArray的四个实例表示,这是一个连接列表(图16-3)。四个vtkCellArrays表示顶点和多边形;线和折线;三角形、四边形和多边形;和三角形条。

        因为vtkPolyData是非结构化的,单元格和点必须显式表示。为了支持其超类vtkDataSet的一些必要方法(主要是拓扑方法,如GetPointCells()和GetCellNeighbors()), vtkPolyData有一个复杂的内部数据结构,如图16-3所示。除了vtkPoints和vtkCellArrays,数据结构由单元格类型(vtkCellTypes)和单元格链接(vtkCellLinks)的列表组成。单元格类型数组允许随机访问单元格。这是必要的,因为vtkCellArray不能支持随机访问,因为单个单元可能在大小上有所不同。cell links数组通过维护对使用特定顶点的所有cell的引用来支持拓扑操作。(请参阅可视化工具箱文本了解更多信息。)这两个类的实例,vtkCellTypes和vtkCellLinks,只有在需要时才实例化。也就是说,如果需要随机访问单元格,则实例化vtkCellTypes;或者如果需要拓扑信息,则实例化vtkCellLinks。

        虽然这个结构相当复杂,但好消息是,在很大程度上,内部结构的管理是由您负责的。通常,只要使用vtkDataSet的API来连接信息,就不需要直接操作结构。在某些情况下,编写过滤器或使用一些vtkPolyData或vtkUnstructuredGrid方法,您可能必须使用BuildCells()和BuildLinks()方法显式地创建单元格类型和/或单元格链接数组。在极少数情况下,您可能希望直接操作结构-删除点或单元,和/或修改链接数组以反映拓扑的变化。更多信息请参阅第355页的“支持数据集的对象”一节。演示使用这些复杂运算符的代码示例包括类图形/vtkDecimatePro,图形/vtkDelaunay2D和图形/ vtkDelaunay3D。

vtkPolyData方法

类vtkPolyData是相当复杂的,重载了许多方法继承自它的超类vtkDataSet和vtkPointSet。大部分的复杂性是由于顶点,直线,多边形和三角形条在单独的vtkCellArrays,和特殊的(几何)方法操作网格。

setvert (vert)

指定顶点列表,vert。参数vert是vtkCellArray的一个实例。注意:顶点和点的区别在于点定义几何;而顶点表示包含单个点的单元格。单元格在VTK中可以直接渲染,而点则不能。

vert = getvert()

获取顶点列表。列表是vtkCellArray的一个实例。

SetLines (lines)

指定行列表,行。参数lines是vtkCellArray的一个实例。

lines = GetLines()

获取行列表。列表是vtkCellArray的一个实例。

setpolyys (polyys)

指定多边形列表,polyys。参数polyys是vtkCellArray的一个实例。

polyys = getpolyys()

获取多边形列表。列表是vtkCellArray的一个实例。

setstripes (stripes)

指定三角形条带的列表。参数strip是vtkCellArray的一个实例。获取三角形条带的列表。列表是vtkCellArray的一个实例。

numvert = getnumberofvert()

返回顶点数。

numLines = getnumberolines()

返回行数。

numpolyys = getnumberofpolyys()

返回多边形的数量。

numstripes = getnumberofstripes()

返回三角形条带的数目。

Allocate(numCells, extend)

分配(numCells, extend)在调用InsertNextCell()方法之前执行初始内存分配(将在接下来的两项中描述)。参数numCells是要插入的单元格数量的估计值;Extend是扩展内部结构的大小(如果需要)。

Allocate(inPolyData, numCells, extend)

和上面的方法类似,这个方法为顶点、直线、多边形和三角形分配初始存储空间。然而,它检查提供的inPolyData来确定分配这些数组中的哪个;只有在inPolyData中对应的数组中有数据时才分配它们。

celllid = InsertNextCell(type, npts, pts)

给定单元格类型、类型、单元格中的点数npts和点id的整数列表pts,插入一个单元格并返回其单元格id。类型值的定义请参见图19-20。请确保在调用此方法之前调用Allocate()。

celllid = InsertNextCell(type, pts)

给定一个单元格类型,类型和实例vtkIdList, pts,插入一个单元格并返回其单元格id。请确保在调用此方法之前调用Allocate()。

Reset()

将vtkPolyData实例恢复到初始状态,而不释放已分配的内存。

BuildCells()

构建内部vtkCellTypes数组。这允许随机访问单元格(例如,GetCell()和其他特殊的vtkPolyData方法)。通常你不需要调用这个方法,除非你在vtkPolyData上做专门的操作。

BuildLinks()

构建内部vtkCellLinks数组。这样可以访问拓扑信息,如邻域(例如,顶点、边、面邻域)。通常你不需要调用这个方法,除非你在vtkPolyData上做特殊操作。

DeleteCells()

释放内部vtkCellTypes数组的内存,允许随机访问细胞。此方法也隐式删除单元格链接,因为它们不再有效。

DeleteLinks()

释放内部vtkCellLinks数组的内存。给定一个点id (ptId),返回使用该点(ncells)的单元格数,以及使用该点(cells)的单元格id的整数数组。给定一个单元格(celllid)和两个点(p1和p2)形成一个单元格的边缘,填写一个用户提供的使用边缘(p1,p2)的所有单元格的列表。给定一个单元格(celllid),返回点的个数(npts)和一个定义单元格连通性的点id的整数列表。这是从它的超类vtkDataSet继承的GetCellPoints(npts, ptid)方法的一个特殊版本。

flag = isttriangle (p1, p2, p3)

一个用于三角形网格的特殊方法。返回一个0/1标志,指示列出的三个点(p1,p2,p3)是否在网格中形成一个三角形。

flag = IsEdge(p1, p2)

返回0/1标志,表示列出的两个点(p1,p2)是否在网格中形成一条边。

flag = IsPointUsedByCell(ptId, celllid)

返回一个0/1标志,表示ptId给出的特定点是否被一个粒子使用细胞(cellId)。

ReplaceCell(celllid, npts, pts)

使用新的连接列表(pts)重新定义单元格(celllid)。注意,点数(npts)必须等于单元格中的原始点数。

ReplaceCellPoint(celllid, oldPtId, newPtId)

通过将一个点id (oldPtId)替换为一个新的点id (newPtId)来重新定义一个单元格的连接列表。

ReverseCell(celllid)

将单元格(celllid)的连接列表定义的顺序反转。例如,如果定义了一个三角形(p1,p2,p3),在调用此方法后,它将由点(p3,p2,p1)定义。

DeletePoint(ptId)

通过删除点到使用它的单元格的所有链接来删除点。这个方法实际上并没有从vtkPoints对象中删除点。

DeleteCell(celllid)

通过将其类型标记为VTK_EMPTY_CELL来删除单元格。这个操作符只修改vtkCellTypes数组,它实际上并没有从vtkCellArray对象中删除单元格的连通性。

ptId = InsertNextLinkedPoint(x, numLinks)

如果vtkCellLinks的实例已经建立,并且您希望在网格中插入一个新的点,使用此方法。参数numLinks是使用该点的单元格列表的初始大小。

ptId = InsertNextLinkedPoint(numLinks)

与上述方法类似,该方法用于分配内存,以便在vtkCellLinks中添加一个新的点。然而,这个方法只分配内存;它不插入点。

celllid = InsertNextLinkedCell(type, npts, pts)

在单元链接和单元类型结构已经构建(即,BuildCells()和BuildLinks()已被调用)之后,插入一个新的单元到vtkPolyData。

ReplaceLinkedCell(celllid, npts, pts)

将一个链接单元格替换为另一个单元格。注意,被替换单元格和替换单元格的npt大小必须相同。从cell links结构中移除所有对cell cellId的引用。这有效地从拓扑上断开了单元与数据结构的连接。在cell links结构中添加对cell cellId的引用。也就是说,所有点的链接都会被修改,以反映单元格cellId的使用情况。

RemoveReferenceToCell(ptId, celllid)

从ptId到cell cellId的链接中删除引用。

在点ptId的链接列表中添加对cell cellId的引用。调整点ptId的链接列表大小,使其大小为size。

CopyCells(pd, idList, locator)

从pd (vtkPolyData)中复制idList (vtkIdList)中列出的单元格,包括点,点数据和单元格数据。此方法假设已经分配了点和单元数据。如果传入一个点定位器,那么这些点将不会在输出中重复。

RemoveGhostCells(level)

移除任何具有幽灵级别数组值至少与指示的级别一样大的单元格。此方法不删除未使用的点。虚影级别表示并行处理应用程序中的分区边界。

16.8非结构化网格

        vtkUnstructuredGrid是一个具体的数据集类型,它表示VTK单元格的所有可能组合(即图19-20所示的所有组合)。数据是完全非结构化的。点由超类vtkPointSet表示,单元格由包括vtkCellArray、vtkCellTypes和vtkCellLinks在内的对象组合表示。通常,这些对象(不包括vtkPoints)在内部使用,您不直接操作它们。有关VTK中非结构化数据结构的更多信息,请参阅第345页的前一节“多边形数据”。另外,请参见第355页的“支持数据集的对象”,了解vtkCellArray、vtkCellTypes和vtkCellLinks的详细接口信息。

        虽然vtkUnstructuredGrid和vtkPolyData是相似的,但有实质性的差异。vtkPolyData只能表示拓扑维度为2或更少的单元格(即三角形带、多边形、线、顶点),而vtkUnstructuredGrid可以表示维度为3或更少的单元格。此外,vtkUnstructuredGrid维护vtkCellTypes的内部实例,以允许随机访问其单元格,而vtkPolyData仅在需要随机访问时实例化vtkCellTypes。最后,vtkUnstructuredGrid维护vtkCellArray的单个内部实例来表示单元连接;vtkPolyData维护了四个数组,分别对应三角形带、多边形、直线和顶点。

vtkUnstructuredGrid方法

Allocate(numCells, extend)

在调用InsertNextCell()方法之前执行初始内存分配(在以下两项中描述)。参数numCells是要插入的单元格数量的估计值;Extend是扩展内部结构的大小(如果需要)。

celllid = InsertNextCell(type, npts, pts)

给定单元格类型(type)、单元格中的点数(npts)和点id的整数列表(pts),插入一个单元格并返回其单元格id。类型值的定义请参见图19-20。请确保在调用此方法之前调用Allocate()。

celllid = InsertNextCell(type, ptIds)

给定一个cell类型(type)和vtkIdList, ptIds的实例,插入一个cell并返回它的cellid。请确保在调用此方法之前调用Allocate()。

Reset()

将vtkUnstructuredGrid实例恢复到初始状态,而不释放已分配的内存。这是一个高性能的方法,允许你一次定义一组单元格。指定单元格类型的整数列表,然后是vtkCellArray的实例。这个方法类似于上面的方法,但是你指定的是单个单元格类型,而不是它们的列表。这个方法类似于上面的两个,但是除了指定一个单元格类型列表之外,还提供了一个单元格位置列表(一个vtkIdTypeArray)。

cells = GetCells()

返回一个指向单元连接列表的指针。返回值cell类型为vtkCellArray。

types = GetCellTypesArray()

返回指向单元格类型数组的指针。返回值类型为vtkUnsignedCharArray。

locs = GetCellLocationsArray()

返回一个指向用于索引连接数组的单元格位置数组的指针。返回值los类型为vtkIdTypeArray。links = GetCellLinks()返回指向单元格链接数组的指针。返回值links的类型为vtkCellLinks。

BuildLinks()

构建内部vtkCellLinks数组。这样可以访问拓扑信息,如邻域(例如,顶点、边、面邻域)。通常你不需要调用这个方法,除非你在vtkUnstructuredGrid上做专门的操作。给定一个单元格(celllid),返回点的个数(npts)和定义单元格连通性的点id的整数列表。这是从vtkUnstructuredGrid的超类GetCellPoints(npts, ptid)方法继承的一个特殊版本的方法。

ReplaceCell(celllid, npts, pts)

使用新的连接列表pts重新定义cell cellId。注意,npts的点数必须等于单元格中原始点数。

celllid = InsertNextLinkedCell(type, npts, pts)

在单元链接结构构建完成后(即调用BuildLinks()方法),向vtkUnstructuredGrid中插入一个新单元。

RemoveReferenceToCell(ptId, celllid)

从ptId到cell cellId的链接中删除引用在点ptId的链接列表中添加对cell cellId的引用。调整点ptId的链接列表大小,使其大小为size。

GetIdsOfCellsOfType(type, array)

使用指定类型的所有单元格的id填充指定的数组(vtkIdTypeArray)。

stat = ishomogenous()

确定vtkUnstructuredGrid数据集是否仅由单一类型的单元格组成。如果为真,返回1;否则返回0。

RemoveGhostCells(level)

移除任何具有幽灵级别数组值至少与指示的级别一样大的单元格。虚影级别表示并行处理应用程序中的分区边界。

16.9单元格

        单元格是数据集的原子。它们用于在数据集中执行局部操作,如插值、坐标变换和搜索,以及各种几何操作。单元格通常用作数据集的“句柄”,返回执行算法所需的本地信息。要从数据集中获取单元格,使用GetCell(int celllid)方法,然后可以处理返回的单元格。

        类vtkCell使用vtkPoints和vtkIdList的实例表示数据(分别表示点坐标和点id)。这两个实例变量是可公开访问的,这是VTK中实例变量是公共的少数例外之一。以下方法可用于vtkCell的所有子类。

vtkCell方法

type = GetCellType()

返回vtkCellType.h中定义的单元格类型。

dim = GetCellDimension()

返回单元格的拓扑维度(0,1,2或3)。

flag = IsLinear()

返回单元格插值是否是线性的。通常是线性的(=1)。

points = GetPoints()

获取单元格的点坐标。

numPts = GetNumberOfPoints()

返回单元格中的点数。

numges = GetNumberOfEdges()

返回单元格中的边数。

numFaces = GetNumberOfFaces()

返回单元格中的面数。

ptIds = GetPointIds()

返回定义单元格的点id列表。

id = GetPointId(ptId)

对于单元格点ptId,返回实际的点id。

edge = GetEdge(edgeId)

从单元格的edgeId返回边缘单元格。

cell = GetFace(faceId)

从cell的faceId返回face cell。

status = CellBoundary(subId, pcods [3], pts)

给定一个点的参数坐标,返回最近的单元边界,以及该点是在单元内部还是外部。单元格边界由一组点(pts)定义,这些点指定一个面(3D单元格)、边缘(2D单元格)或顶点(1D单元格)。如果该方法的返回值为!= 0,则该点在单元格内。

status = EvaluatePosition(x[3], closestPoint[3], subbid, pcods [3], dist2, weights[])

给定一个点x[3],返回单元格内部(=1)或外部(=0);求参数坐标,子单元格id (!=0(仅当cell是复合的),点x[3]到cell(特别是指明的子cell)的距离平方,cell上离x[3]最近的点,以及cell中的插值权重。(权重的数量等于定义单元格的点数)。注意:在极少数情况下,该方法会返回-1。这意味着发生了数值错误,应该忽略从该方法返回的所有数据。

EvaluateLocation(subbid, pcods [3], x[3], weights[])

从subbid和参数坐标确定全局坐标(x[3])。还返回插值权重。(权重的数量等于单元格中的点的数量。)轮廓(值,细胞标量,定位器,vert, lines, polyys, inPd, outPd, inCd, cellId, outCd)生成轮廓原语。标量列表cellscalar包含每个单元格点的标量值。定位器本质上是一个点列表,它在插入点时合并点(即防止重复)。轮廓基元可以是顶点、直线或多边形。通过提供输入和输出点数据,可以沿边缘插值点数据;如果outPd为NULL,则不执行插值。此外,如果输出单元格数据(outCd)为非null,则来自轮廓单元格的单元格数据将传递给生成的轮廓原语。

Clip(value, cellScalars, locator, connectivity, inPd, outPd, inCd, celllid, outCd, insideOut)

根据输入的cellScalars和指定的值剪切(或剪辑)单元格。剪辑操作的输出将是与原始单元具有相同拓扑维度的一个或多个单元。标志insideOut控制单元格的哪一部分被认为是内部的——通常,标量值大于“value”的单元格点被认为是内部的。如果insideOut打开,则情况正好相反。此外,如果输出单元格数据(outCd)为非null,则来自被剪辑单元格的单元格数据被传递给生成的被剪辑原语。

status = IntersectWithLine(p1[3], p2[3], tol, t, x[3], pcods [3], subId)

与p1和p2定义的射线相交。返回参数坐标(行和单元格)。非零返回值表示发生了交集。您可以在交集操作上指定一个公差工具。生成近似该单元格几何形状的适当尺寸的简单体。三维细胞将生成四面体,;二维单元格三角形;等等......。如果三角测量失败,则返回零。

Derivatives(subId, pcord [3], values, dim, Derivatives)

计算该单元格给定值的导数。

GetBounds(bounds[6])

设置单元格的边界框值(xmin, xmax, ymin, ymax, zmin, zmax)。

bounds = GetBounds()

返回一个指向单元格边界的指针。

length2 = GetLength2()

返回单元格长度的平方(长度是单元格边界框的对角线)。

status = getparametercenter (pcoord[3])

返回单元格中心的参数坐标。如果单元格是复合单元格,则返回中心所在的特定subId。

pcoordds = getparametercord()

返回定义此单元格的点的参数坐标。返回给定参数值的单元格的距离。执行单元格的浅层(引用计数)拷贝。执行深(所有数据的拷贝)单元格的拷贝。

Initialize(npts, pts, p)

使用指定的点id (pts)和点坐标(p, vtkPoints的一个实例)从外部初始化单元格。npts参数表示单元格中的点数。

req = RequiresInitialization()

返回单元格在访问之前是否需要初始化。(例如,单元格可能需要对自身进行三角测量或设置内部数据结构。)Initialize()允许单元格像前面方法的描述中提到的那样初始化自身。

exp = IsExplicitCell()

返回一个cell是否是显式的(即,除了cell类型和连接性之外,它是否需要额外的表示信息)。VTK中的大多数细胞是隐式的,而不是显式的。

pri = IsPrimaryCell()

返回单元是否具有固定拓扑。例如,vtkTriangle是主单元格,但vtkTriangleStrip不是。

16.10数据集支持的对象

        我们在前面看到,一些数据集类型需要实例化和操作组件对象。
例如,vtkStructuredGrid需要创建vtkPoints的实例来定义其点位置,vtkPolyData需要实例化vtkCellArray来定义单元连接。在本节中,我们将描述这些支持对象的接口。图16-3描述了这些对象之间的关系。

vtkPoints方法

vtkPoints表示x-y-z点坐标信息。vtkPoints的实例用于显式地表示点。

vtkPoints依赖于vtkDataArray的内部实例,因此支持不同原生类型的数据(即int, float等)。

num = GetNumberOfPoints()

返回数组中点数的个数。

x = GetPoint(int id)

返回一个指向三个双精度数组的指针:x-y-z坐标位置。此方法不是线程安全的。给定一个点id id,用x-y-z坐标位置填充用户提供的长度为3的双数组。

SetNumberOfPoints(number)

指定数组中点的数量,必要时分配内存。将此方法与SetPoint()结合使用,将数据放入vtkPoints数组。

SetPoint(id, x)

直接在指定的位置id上设置点坐标x。不执行范围检查,因此此方法比插入方法快。确保在使用此方法之前调用了SetNumberOfPoints()。

SetPoint(id, x, y, z)

直接在指定的位置id上设置点坐标(x, y, z)。不执行范围检查,因此,此方法比插入方法快。确保在使用此方法之前调用了SetNumberOfPoints()。

InsertPoint (id, x)

在指定的位置id插入点坐标x。执行范围检查,并根据需要分配内存。

InsertPoint(id, x,y,z)

在指定的位置id插入点坐标(x,y,z)。执行范围检查并根据需要分配内存。

pointId = InsertNextPoint(x)

在数组的末尾插入点坐标x,返回它的点id。执行范围检查并根据需要分配内存。

pointId = InsertNextPoint(x, y,z)

在数组的末尾插入点坐标(x,y,z),返回它的点id。执行范围检查并根据需要分配内存。给定一个点ptid列表,用相应的坐标值填充用户提供的vtkPoints实例。

bounds = GetBounds()

返回一个指向大小为6的数组的指针,该数组包含点的边界(xmin,xmax, ymin,ymax, zmin,zmax)。此方法不是线程安全的。在用户提供的大小为6的数组中填充点的边界(xmin,xmax, ymin,ymax, zmin,zmax)。分配(大小,扩展)执行初始内存分配。参数大小是要插入的点的数量的估计;Extend是扩展内部结构的大小(如果需要)。

Initialize()

将对象返回到实例化时的状态,包括释放内存。

SetData(pts)

设置底层vtkDataArray (pts),指定点坐标。“vtkDataArray”中的组件个数必须为3。

pts = GetData()

返回包含点坐标的底层vtkDataArray。dType = GetDataType()返回一个整数表示点坐标的数据类型。

SetDataType(dType)

设置点坐标的数据类型。请参阅vtkType.h获取可能的类型列表。

ptr = GetVoidPointer(id)

返回一个空指针,指向从指定索引(id)开始的底层数据数组中包含的数据。

Squeeze()

回收数据结构中的任何额外内存。

Reset()

将对象恢复到初始状态,但不释放内存。

DeepCopy(pts)

将给定的vtkPoints (pts)复制到这个vtkPoints实例,生成数据的第二次副本。

ShallowCopy(pts)

使用引用计数将给定的vtkPoints (pts)复制到这个vtkPoints实例。

size = GetActualMemorySize()

返回vtkPoints实例的大小,单位为千字节。

ComputeBounds()

确定vtkPoints实例中包含的点坐标的边界框。

vtkCellArray方法

vtkCellArray表示单元格的拓扑(即连通性)信息。单元格的连通性由点id的有序整数列表定义。创建和操作vtkCellArrays的方法如下所示。

Allocate(size, extend)

在调用InsertNextCell()方法之前执行初始内存分配。参数size是列表中要插入的条目数;Extend是扩展内部结构的大小(如果需要)。

Initialize()

将对象设置为其原始状态,释放可能已分配的内存。

size = EstimateSize(numCells, PtsPerCell)

根据单元格的数量估计要插入的数据的大小,以及每个单元格的期望点数。这个方法返回一个估计值;将它与Allocate()方法结合使用来执行初始内存分配。

void InitTraversal()

初始化连通性数组的遍历。与GetNextCell()一起使用。

nonEmpty = GetNextCell(npts, pts)

获取列表中的下一个单元格,返回点数npts和点id pts的整数数组。如果列表为空,则返回0;否则返回非零。

size = GetSize()

返回列表中分配的条目数。

numEntries = GetNumberOfConnectivityEntries()

返回到目前为止添加到列表中的数据值总数。

GetCell(loc, npts, pts)

返回位置偏移量loc的单元格的特殊方法。此方法通常用于随机访问单元数组的非结构化数据。请注意,loc与单元格id不同,它是单元格数组中的偏移量。参见360页的GetCellLocation(id)celllid = InsertNextCell(cell)在数组中插入一个单元格。参数cell的类型为vtkCell。返回单元格id。

celllid = InsertNextCell(npts, pts)

通过指定点数npts和单元格id的整数列表将一个单元格插入数组。返回单元格id。

celllid = InsertNextCell(pts)

通过提供id列表(vtkIdList)将单元格插入数组。返回单元格id。

celllid = InsertNextCell(npts)

通过指定单元格点的数量将单元格插入到单元格数组中。该方法之后通常会多次调用InsertCellPoint()来定义单元格点,可能还会调用UpdateCellCount()来指定最终的点数。

InsertCellPoint(id)

在单元格数组中插入一个单元格点。此方法需要事先调用InsertNextCell(npts)。

UpdateCellCount(npts)

指定调用InsertNextCell(npts)和InsertCellPoint()后定义单元格的最终点数。此方法允许您在使用InsertNextCell(npts)估计初始点计数后调整点的数量。

location = GetInsertLocation(npts)

返回单元格数组中的当前插入位置。

InsertNextCell()

等方法使用插入位置。位置是单元格数组的偏移量。

location = GetTraversalLocation(npts)

返回单元格数组中当前的遍历位置。插入位置由GetCell()等方法使用。位置是单元格数组的偏移量。

ReverseCell(loc)

反转单元格cellId的连接列表定义的顺序。例如,如果定义了一个三角形(p1,p2,p3),在调用此方法后,它将由点(p3,p2,p1)定义。用新的连接列表pts重新定义偏移位置loc上的单元格。注意,npts的点数必须等于单元格数组中原始点数。

maxSize = GetMaxCellSize()

返回单元格数组连接列表中任何单元格的最大大小,以定义它的点的数量表示。

ptr = GetPointer()

返回一个指向单元格数组的整数指针。返回数据中的数据结构是单元格中的点数,然后是其连通性列表,对于每个单元格重复:(npts, p0, p1, p2,…)pnpts-1;Npts, p0, p1, p2,…, pnpts-1,…)。

ptr = WritePointer(ncells, size)

为指定大小为ncells的cell数组分配内存。大小包括连通性条目以及每个单元格的计数。

Reset()

将对象恢复到初始状态,但不释放先前分配的内存。挤压()恢复数组中任何未使用的空间。

SetNumberOfCells(numCells)

设置数组中的单元格数量。此方法不分配内存。

numCells = GetNumberOfCells()

返回单元格数组中的单元格数。

SetTraversalLocation(loc)

设置数组中的当前遍历位置。遍历位置是单元格数组的偏移量;它被GetNextCell()方法使用。

loc = GetTraversalLocation()

获取数组中的当前遍历位置。通过提供一个连接列表(cells,一个vtkIdTypeArray)来定义多个cell(由ncells给出的数字)。单元格数组的形式为(npts, p0, p1,…,p(npts-1)),每个单元格重复一次。当使用此方法时,它会覆盖先前存储在此数组中的任何内容,因此任何引用这些单元格的内容都将无效。遍历位置被设置为列表的开头,插入位置被设置为列表的末尾。

DeepCopy(ca)

复制给定的vtkCellArray (ca)到这个vtkCellArray,使数据的第二个副本。

array = GetData()

返回一个指向底层数据数组(vtkIdTypeArray)的指针。

size = GetActualMemorySize()

以千字节为单位返回此单元格数组使用的内存

vtkCellTypes方法

类vtkCellTypes提供对单元格的随机访问。vtkCellTypes的实例总是与至少一个vtkCellArray实例相关联,后者实际上定义了单元格的连接列表。vtkCellTypes中包含的信息是(对于每个单元格)指定的单元格类型(如图19-20中定义的整数标志)和位置偏移量,这是一个表示相关vtkCellArray偏移量的整数值。

Allocate(size, extend)

在调用InsertNextCell()方法之前执行初始内存分配。参数大小是要插入的单元格数量的估计值;Extend是扩展内部结构的大小(如果需要)。

InsertCell(id, type, loc)

给定单元格类型类型及其在关联的vtkCellArray中的位置偏移量,在指定的位置(id)插入单元格类型。

celllid = InsertNextCell(type, loc)

给定单元格类型type及其在关联的vtkCellArray中的位置偏移量,在数组的末尾插入单元格类型并返回其单元格id。

DeleteCell(celllid)

通过将其类型标记为VTK_EMPTY_CELL来删除单元格。

numTypes = GetNumberOfTypes()

返回列表中条目的数量(即单元格类型)。

IsType(type)

如果指定的类型包含在vtkCellTypes数组中,则返回1;否则返回零。

celllid = InsertNextType(type)

将指定的类型添加到列表末尾,返回其单元格id。

type = GetCellType(id)

返回id给出的单元格类型。

loc = GetCellLocation(id)

获取由id给出的单元格的偏移位置到关联的vtkCellArray实例中。挤压()恢复数组中任何未使用的空间。

Reset()

将对象恢复到初始状态,但不释放先前分配的内存。通过提供一个单元格类型列表(cellTypes,一个vtkUnsignedCharArray)和一个单元格位置列表(cellLocations,一个vtkIntArray)来指定一组单元格类型(由ncells给出的数字)。当使用此方法时,它将覆盖先前存储在此数组中的任何内容。

size = GetActualMemorySize()

返回vtkCellTypes实例使用的内存,单位为千字节。DeepCopy(ct)复制vtkCellTypes实例(ct)到这个vtkCellTypes实例,使数据的第二个副本。

vtkCellLinks方法

类vtkCellLinks提供描述单元使用点的拓扑信息。可以将vtkCellLinks对象看作使用特定点的单元格列表的列表。(如图16-3所示)该信息用于派生次要拓扑信息,如面、边和顶点邻居。vtkCellLinks的实例总是与vtkPoints实例相关联,并且通过vtkCellTypes和vtkCellArray对象访问单元格。

link_s = GetLink(ptId)

返回一个指向结构的指针,该结构包含使用点pointId的单元格数量以及指向使用该点的单元格列表的指针。

ncells = GetNcells(pointId)

返回使用点pointId的单元格数。给出一个指向VTK数据集的指针,构建链路拓扑结构。给出一个指向VTK数据集的指针和一个vtkCellArray (connectivity),构建链接拓扑结构。使用连接性数组来确定哪个单元引用哪个点。

cellList = GetCells(ptId)

返回指向以ptId为点的单元格列表的指针。

ptId = InsertNextPoint(numLinks)

在单元格链接数组的末尾为链接分配(如果需要)并插入空间。参数numLinks是列表的初始大小。

InsertNextCellReference(ptId, celllid)

为点ptId插入对cell cellId的引用。这意味着cellId在其定义中使用点ptId。

DeletePoint(ptId)

通过删除点到使用它的单元格的所有链接来删除点。这个方法实际上并没有从vtkPoints对象中删除点。从点ptId的单元格列表中删除对单元格cellId的所有引用。

AddCellReference(celllid, ptId)

在点ptId的单元格列表中添加对单元格cellId的引用。分配(如果需要)和调整单元格列表的大小,使用点ptId到给定的大小。挤压()恢复数组中任何未使用的空间。

Reset()

将对象恢复到初始状态,但不释放先前分配的内存。

Allocate(numLinks, extend)

执行初始内存分配。将分配由numLinks指定的链路数量。未使用extend参数。

size = GetActualMemorySize()

返回vtkCellLinks实例使用的内存,以千字节为单位。

DeepCopy(cl)

复制给定的vtkCellLinks (cl)到这个vtkCellLinks,使数据的第二个副本。

16.11字段和属性数据

        前面的小节描述了如何创建、访问和生成数据集的结构,包括底层对象,如vtkPoints和vtkCellArray。在本节中,我们将描述vtkFieldData和vtkDataSetAttributes,这两个类用于管理数据值(标量、向量、张量、法线和纹理坐标)和任意信息的处理。这些类提供了许多方便的方法,用于复制、插值和将数据从过滤器的输入传递到其输出。vtkDataSets包含这些类的3个实例,一个字段数据存储不对齐的值,一个数据集属性为点和单元格相关的值。

vtkFieldData方法

vtkFieldData是数组的容器。作为VTK 4.0, vtkFieldData是vtkDataSetAttributes的超类(因此vtkPointData和vtkCellData继承自vtkDataSetAttributes)。因此,所有的字段和属性(标量、向量、法线、张量和纹理坐标)都存储在字段数据中,并且可以很容易地交换(参见第249页的“使用字段数据”,了解操作字段的更多信息)。现在可以将一个字段(vtkDataArray)关联到,例如,vtkPointData,然后将其标记为活动向量数组。

PassData(fromData)

将字段数据从输入(fromData)复制到输出。使用引用计数,复制标志(例如CopyFieldOn/Off)控制复制或省略哪些字段。

num = GetNumberOfArrays()

获取字段数据中当前数组的个数。给定一个索引,返回对应的数组。给定一个名称,返回对应的数组。给定一个名称,返回对应的数组。在提供的索引参数中返回数组的索引。如果找不到array,该参数设置为-1。

val = HasArray(name)

如果在此vtkFieldData中存在给定名称的数组,则返回1。否则返回0。

name = GetArrayName(index)

返回给定索引处的数组名称。AddArray(array)添加字段(vtkDataArray)。

RemoveArray(name)

移除给定名称的数组。

DeepCopy(data)

复制输入数据(vtkFieldData)。执行深度拷贝,这意味着复制已分配的内存。ShallowCopy(数据)复制输入数据(vtkFieldData)。执行浅拷贝,这意味着对底层数据对象进行引用计数。

Squeeze()

恢复每个数据数组中的任何额外空间。

mtime = GetMTime()

通过检查该对象自身的修改时间以及相关字段(数组)的修改时间返回该对象的修改时间。

CopyFieldOn/Off(name)

这些方法用于控制从输入到输出的各个字段的复制和插值。如果关闭,则不复制或插入具有给定名称的字段。

CopyAllOn/Off()

控制是否所有的数组在这个vtkFieldData被复制和插值从输入到输出。如果关闭,则不会复制或插入任何数组;如果开了,一切都会开。

CopyFieldOn/Off

设置的标志覆盖了这一点。

Initialize()

将vtkFieldData实例设置为初始状态,包括释放已分配的内存。分配(大小,扩展)为vtkFieldData实例中的每个vtkDataArray分配内存。大小和扩展参数被传递给每个vtkDataArray。

CopyStructure(fd)

根据给定的(fd)设置vtkFieldData实例的结构。删除所有现有的数据数组。来自输入vtkFieldData的数组将在此vtkFieldData中创建,并且它们将具有相同的类型,名称和宽度,但它们将不包含数据。

AllocateArrays(num)

指定vtkFieldData中包含的数据数组的个数。Reset()复位vtkFieldData中的每个数据数组,但不释放内存。

size = GetActualMemorySize()

返回该vtkFieldData使用的内存量,单位为千字节。

GetField(ptIds, f)

用ptIds (vtkIdList)中指定的id的元组填充提供的vtkFieldData (f)实例。提供的vtkFieldData应该具有与此相同的vtkdataarray的数量和类型。

numComps = GetNumberOfComponents()

返回vtkFieldData中组件的个数。这是通过将此vtkFieldData中每个非null数据数组中的组件数量相加来确定的。

arrayNum = GetArrayContainingComponent(N, arrayComp)

返回包含该vtkFieldData的第N个全局组件的数组的索引。(如果此vtkFieldData不包含该组件,则返回-1)在arrayComp参数,返回与所请求的全局组件匹配的数据数组的特定组件。

numup = GetNumberOfTuples()

返回vtkFieldData中元组的个数。(返回第一个数据数组中元组的个数。)

SetNumberOfTuples(num)

设置vtkFieldData中每个数据数组的元组数量(num)。

tuple = GetTuple(index)

返回一个元组,该元组由vtkFieldData中包含的每个数据数组中指定的元组的连接组成。返回的数组类型为double,因此所有数据值在返回之前都转换为double。此方法提供与上面的方法相同的功能,但元组以用户提供的数据数组返回。确保所提供的数组分配了足够的内存。

SetTuple(index, tuple)

在指定索引处设置元组。不执行范围检查。

InsertTuple(index, tuple)

在指定的索引位置插入元组。执行范围检查,并根据需要分配内存。

id = InsertNextTuple(tuple)

插入vtkFieldData末尾的元组。执行范围检查,并根据需要分配内存。返回这个元组的id。

comp = GetComponent(i, j)

返回第i个元组和第j个元素的值(以双精度类型)。

SetComponent(i, j, comp)

设置第i个元组和第j个组件的值。不执行范围检查。

InsertComponent(i, j, comp)

插入第i个元组和第j个元素处的值。执行范围检查,并根据需要分配内存

vtkDataSetAttributes方法

回想一下,有两种类型的属性:与数据集的点(vtkPointData)相关联的属性和与数据集的单元(vtkCellData)相关联的属性。这两个类都是vtkDataSetAttributes的子类(这是vtkFieldData的子类),并且具有几乎相同的接口。以下方法是由vtkDataSetAttributes定义的,对vtkPointData和vtkCellData都是通用的。记住:所有数据集都有属性数据(包括单元格和点),所以所有数据集的属性数据都响应这些方法。

PassData(fromData)

将属性数据从输入(fromData)复制到输出属性数据。使用引用计数,并使用复制标志(例如CopyScalars)来控制复制哪些属性数据。

CopyAllocate(fromData, size, extend)

分配内存并初始化拷贝进程。复制过程包括逐项复制数据(例如,逐点或逐单元格)。每个vtkAttributeData对象的初始分配大小由size给出;如果在复制过程中必须动态调整对象的大小,则按extend对对象进行扩展。

CopyData(fromData, fromId, toId)

将fromId位置的输入属性数据(fromData)复制到输出属性数据中的toId位置。

InterpolateAllocate(fromData, size, extend)

分配内存并初始化插值过程。插值过程包括跨单元或单元拓扑特征(例如,边缘)插值数据。每个vtkAttributeData对象的初始分配大小由size给出;如果在插值过程中必须动态调整对象的大小,则通过extend扩展对象。

InterpolatePoint(fromData, toId, Ids, weights)

从给定的数据集属性(fromData)插值到指定的点(toId)。插值是通过将列表id中每个点的属性值与所提供的插值权值的乘积相加来执行的。

InterpolateEdge(fromData, toId, id1, id2, t)

类似于之前的方法,除了在id1和id2之间使用参数坐标t进行插值。

DeepCopy(data)

复制输入数据(一个vtkDataSetAttributes)。执行深度拷贝,这意味着复制已分配的内存。

ShallowCopy(data)

复制输入数据(一个vtkDataSetAttributes)。执行浅拷贝,这意味着对底层数据对象进行引用计数。

SetScalars(scalars)

指定提供的vtkDataArray将被视为活动标量数组。除非另有指示,否则许多滤波器都在有源阵列上运行。

SetActiveScalars(name)

指定具有给定名称的数组是标量属性数据。

scalars = GetScalars()

检索活动标量(vtkDataArray)属性数据。

scalars = GetScalars(name)

获取指定名称的数组。如果name为NULL,或者没有与该名称匹配的数组,则返回活动标量属性数据数组。

SetVectors(vectors)

指定所提供的vtkDataArray将被视为活动向量数组。除非另有指示,否则许多滤波器都在有源阵列上运行。

SetActiveVectors(name)

将给定名称的活动数组设置为矢量属性数据。

vectors = GetVectors()

检索活动向量(vtkDataArray)属性数据。

vectors = GetVectors(name)

获取指定名称的数组。如果name为NULL,或者没有与该名称匹配的数组,则返回向量属性数据数组。

SetTensors(tensors)

指定提供的vtkDataArray将被视为活动张量数组。除非另有指示,否则许多滤波器都在有源阵列上运行。

SetActiveTensors(name)

将给定名称的活动数组设置为张量属性数据。

tensors = GetTensors()

检索活动张量(vtkDataArray)属性数据。

tensors = GetTensors(name)

获取指定名称的数组。如果name为NULL,或者没有与该名称匹配的数组,则返回张量属性数据数组。

SetNormals(normals)

指定提供的vtkDataArray将被视为活动的normal数组。除非另有指示,否则许多滤波器都在有源阵列上运行。

setactivennormals (name)

将给定名称的活动数组设置为normal属性数据。

normals = GetNormals()

检索活动的normal (vtkDataArray)属性数据。

normals = GetNormals(name)

获取指定名称的数组。如果name为NULL,或者没有与该名称匹配的数组,则返回普通属性数据数组。

settcoord (tcoord)

指定提供的vtkDataArray被视为活动纹理坐标数组。除非另有指示,否则许多滤波器都在有源阵列上运行。

setactivetcoordds (name)

设置具有给定名称的活动数组作为纹理坐标属性数据。

tcoordds = gettcoordds()

检索活动纹理坐标(vtkDataArray)属性数据。

tcoordds = gettcoordds (name)

获取指定名称的数组。如果name为NULL,或者没有与该名称匹配的数组,则返回纹理坐标属性数据数组。

SetGlobalIds(GlobalIds)

全局id用于为每个单元格和/或点分配唯一的名称。过滤器尽可能地保留全局id,并且永远不会内插,因为它们表示标识用领带代替数字数量。共享全局id的任何两个单元格(或点)都被认为是相同的东西。指定所提供的vtkDataArray将被视为活动的全局id数组。

SetActiveGlobalIds(name)

指定具有给定名称的数组作为全局id属性数据。

SetActiveGlobalIds(name)

检索活动的全局id (vtkDataArray)属性数据。

globalids = GetGlobalIds(name)

获取指定名称的数组。如果name为NULL,或者没有与该名称匹配的数组,则返回活动的全局id属性数据数组。与全局id一样,系谱id用于为每个单元格和/或点分配名称。谱系id被管道中的过滤器类似地处理,但不是唯一的——谱系id用于维护祖先信息。使用谱系id,可以将输出单元格(或点)追溯到生成它的原始单元格(或点)。指定所提供的vtkDataArray将被视为活动谱系id数组。

SetActivePedigreeIds(name)

指定具有给定名称的数组作为系谱id属性数据。

pedigreeids = GetPedigreeIds()

检索活动谱系id (vtkDataArray)属性数据。

pedigreeids = GetPedigreeIds(name)

获取指定名称的array。如果name为NULL,或者没有与该名称匹配的数组,则返回活动谱系id属性数据数组。

CopyScalarsOn/Off()

这些方法用于控制标量数据从输入到输出的复制和插值。如果关闭,则不复制或插入标量数据。

CopyVectorsOn/Off()

这些方法用于控制矢量数据从输入到输出的复制和插值。如果关闭,则不复制或插值矢量数据。

CopyTensorsOn/Off()

这些方法用于控制张量数据从输入到输出的复制和插值。如果关闭,张量数据不会被复制或插值。

CopyNormalsOn/Off()

这些方法用于控制正常数据从输入到输出的复制和插值。如果关闭,则不复制或插入正常数据。

CopyTCoordsOn/Off()

这些方法用于控制纹理坐标数据从输入到输出的复制和插值。如果关闭,纹理坐标数据不会被复制或插值。

CopyGlobalIdsOn /Off()

这些方法用于控制从输入到输出的全局id数据的复制和插值。如果关闭,则不复制或插入全局id数据。

CopyPedigreeIdsOn/Off()

这些方法用于控制从输入到输出的系谱id数据的复制和插值。如果关闭,则不复制或插入系谱id数据。

CopyAllOn/Off()

这些方便的方法可以同时打开或关闭所有的复制标志。

CopyStructuredData(inData, inExt, outExt)

将输入vtkDataSetAttributes (inData)中给定输入范围(inExt)中的点/单元格的属性数据复制到给定输出范围(outExt)中的点/单元格的vtkDataSetAttributes。

InterpolateTime(fromData1, fromData2, id, t)

对于给定的点或单元格id (id),在指定的时间t(范围在0到1之间)在给定的两个数据集属性(fromData1和fromData2)之间进行插值。确保在调用该方法之前调用了InterpolateAllocate方法。

idx = SetActiveAttribute(name, attributeType)

将给定名称的数组设置为指定的活动属性(标量= 0,向量= 1,法线= 2,纹理坐标= 3,张量= 4,全局id =5,系谱id =6)。返回具有给定名称的数组的索引。如果此vtkDataSetAttributes中不存在指定名称的数组,则返回-1。

idx = SetActiveAttribute(index, attributeType)

与上面的方法类似,但是通过索引而不是名称来指定数组。

SetCopyAttribute(index, value)

指定是否复制索引所指示的数据集属性。值为0表示不复制该数组;值为1表示将是。不同属性类型对应的索引在上面第一个SetActiveAttribute方法的描述中给出。

CopyTuple(fromData, toData, fromId, toId)

将fromData数据数组中fromId索引处的元组复制到toData数据数组中toId索引处的元组。用标量、向量等对应的数组的索引填充用户提供的索引数组(int数组)。对应于不同属性类型的索引(用于在所提供的数组中建立索引)在上面第一个SetActiveAttribute方法的描述中给出。

attr = IsArrayAnAttribute(index)

判断指定索引处的数据数组是否为数据集属性。如果是,返回一个指示它是哪个属性的索引(标量= 0,向量= 1,法线= 2,纹理坐标= 3,张量= 4)。

array = GetAttribute(attributeType)

返回与给定属性类型对应的数据数组。

RemoveArray(名字)


从此vtkDataSetAttributes中的数组列表中删除具有给定名称的数组。

attr = GetAttributeTypeAsString(attributeType)


给定与属性类型对应的索引,以字符串形式返回该属性类型

16.12选择

        vtkSelection提供了表示数据对象子集的方法。这些包括索引或标识符、属性值范围、位置、截点或块的列表。可以将选择应用于特定数据对象以提取其所选数据,也可以通过过滤器进行修改以扩展、缩小或以其他方式更改选择的性质。选择是由vtkSelectionSource和vtkHardwareSelector等类生成的,前者基于过滤器参数生成选择,后者使用图形硬件选择在屏幕的矩形区域内呈现的项目。

        vtkSelection只是vtkSelectionNode对象的容器。每个选择节点包含有关其选择部分的所有信息。这种两层结构允许单个选择组合来自数据对象不同部分的信息,例如对点和单元格的选择,并允许选择在多块数据集的不同块上维护选择信息。

vtkSelection 方法

 n = GetNumberOfNodes()

返回选择中vtkSelectionNode对象的个数。

node = GetNode(i)

返回第i个vtkSelectionNode。

AddNode(node)

将vtkSelectionNode追加到节点列表的末尾。

RemoveNode(i)

移除第i个vtkSelectionNode。

RemoveNode(node)

删除指定的vtkSelectionNode,如果它存在于选择中。

RemoveAllNodes()

删除所有vtkSelectionNode对象,留下一个空的选择。联合(sel)将此选择与指定的vtkSelection联合。如果节点的属性完全匹配,则尝试追加到现有节点。否则,它将向选择中添加新的选择节点。Union(node)将此选择与指定的vtkSelectionNode联合。如果节点的属性完全匹配,则尝试追加到现有节点。否则,它将向选择添加一个新的选择节点。

vtkSelectionNode方法

基本上,vtkSelectionNode只是数组的集合(通常是单个数组)。选择节点的其他属性精确地指示应该如何解释数组中的值。SetSelectionList(arr)设置一个数组,该数组将被用作所选项目的列表,或者根据内容类型以其他方式进行解释。

arr = GetSelectionList()

返回选择列表。

SetSelectionData(data)

为vtkDataSetAttributes实例中存储的选择节点设置数组集合。第一个数组的解释方式与普通选择列表的单个数组相同。仅对于VALUES类型选择,附加数组用作进一步的限定符,以便可以同时匹配多个数据数组。

data = GetSelectionData()

返回选择节点的数组集合,作为vtkDataSetAttributes实例。

SetContentType(type)

设置内容类型为常量之一的选择,GLOBALIDS, PEDIGREEIDS,值,索引,FRUSTUM,位置,阈值,块在vtkSelectionNode中定义。内容类型定义了如何解释选择列表。每种类型的含义在[参考:选择部分]中有描述。

type = GetContentType()

返回内容类型。

SetFieldType(type)

将字段类型设置为vtkSelectionNode中定义的常量CELL, POINT, field, VERTEX, EDGE, ROW之一。这决定了选择指向数据对象的哪些部分(vtkDataSet子类中的点或单元格,vtkDataObject的字段数据,vtkGraph的顶点或边,或vtkTable的行)。

type = GetFieldType()

返回字段类型。

UnionSelectionList(node)

将另一个vtkSelectionNode的选择列表合并到该节点。这假定两个节点具有相同的属性。

vtkSelectionNode属性方法

info = GetProperties()


返回存储在vtkInformation通用容器对象中的选择节点的属性。

eq = EqualProperties(node, full)


如果此节点中的所有属性也被设置为作为参数给出的节点中的相同值,则返回true。第二个参数是一个标志,指示是否也完全在返回true之前,检查相反方向的属性(即该节点包含作为参数传递的节点的所有属性)。

GetProperties()-&gt;Set(vtkSelectionNode:: INVERSE(), inv)

选择是否应该反转,在这种情况下,选择定义不感兴趣的内容而不是感兴趣的内容。

GetProperties()-&gt;Set(vtkSelectionNode::EPSILON(), eps)

对于内容类型LOCATION,这是一个容差(几何距离),在该容差范围内的项被接受,超出该容差范围则被拒绝。

GetProperties()-&gt;Set(vtkSelectionNode:: CONTAINING_CELLS(), c)

此标志告诉提取过滤器,当字段类型为POINT时,它还应该提取包含任何提取点的单元格。

GetProperties()-&gt;Set(vtkSelectionNode:: PIXEL_COUNT(), count)

屏幕空间选择的帮助器,这是演员所覆盖的像素数,其单元格列在选择节点中。

GetProperties()-&gt;Set(vtkSelectionNode:: SOURCE(), alg)

选择所属的数据或算法指针。

GetProperties()-&gt;Set(vtkSelectionNode:: SOURCE_ID(), id)

选择所属数据或算法的id。ID的含义是特定于应用程序的。

GetProperties()-&gt;Set(vtkSelectionNode:: PROP(), obj)

指向选择所属的道具的指针。

GetProperties()-&gt;Set(vtkSelectionNode:: PROP_ID(), id)

选择所属道具的id。ID的含义是特定于应用程序的。

GetProperties()-&gt;Set(vtkSelectionNode:: PROCESS_ID(), id)

选择所指向的进程id。

GetProperties()-&gt;Set(vtkSelectionNode:: COMPOSITE_INDEX(), i)

用于标识复合数据集中的节点。

GetProperties()-&gt;Set(vtkSelectionNode:: HIERARCHICAL_LEVEL(), level)

用于标识AMR (hierarchical box)数据集中数据集的级别。

GetProperties()-&gt;Set(vtkSelectionNode:: HIERARCHICAL_INDEX(), i)

用于标识AMR (hierarchical box)数据集中数据集的索引。

16.13图

        图类的层次结构如图[图graph- hierarchy]所示。在顶层,我们区分边缘从源到目标有固有顺序的图(有向图)和边缘不指示方向的图(无向图)。有向图的子类是通过专门化自然构造的。有向无环图是所有有向图类的一个子集。vtkTree通过强制层次结构进一步限制了这一点:除了根节点之外的每个顶点都必须有一个父节点(传入边)可变类用于创建或修改图形。一个图的结构可以被复制到任何其他的图实例中,如果它首先通过了兼容性测试。

        这种层次结构为我们提供了几个优势。在vtkGraph上操作的过滤器将适用于所有图形类型。所以一个人可以发送一个vtkTree或vtkDirectedAcyclicGraph到一个过滤器,它采用更一般的vtkGraph作为输入类型(如vtkVertexDegree)。子类还允许过滤器特定于输入类型:如果过滤器需要树,则可以将其指定为输入类型。单独的可变类允许VTK强制图形数据结构的所有实例在任何时候都是有效的。如果vtkGraph本身是可变的,它会有添加边和顶点的方法。由于继承,该方法将存在于所有子类中,包括vtkTree。结果可能是vtkTree有时会保存一个不是有效树的结构。在每次添加边或顶点后检查有效树的时间和复杂度都非常昂贵。

        图数据结构的另一个特性是写时复制。因为所有的图都共享相同的内部表示,所以多个对象,即使是不同类型的对象,也可以共享相同的结构。只有当用户修改与其他图共享结构的图时,才会进行结构的深度拷贝。对于调用者来说,图形实例的行为就像它们独立于其他图形一样,而内部内存使用则得到了优化。

        用户可以将任意数量的数组分配给图的顶点和边,就像将属性分配给vtkDataSet子类中的点和单元格一样。这些属性可以以各种方式使用来改变图形的可视化,即使用它们来给图形上色或贴上标签。

vtkGraph方法

vtkGraph是所有图类型的超类。因为它不是可变的,所以它只提供对图结构的读访问。

data = GetVertexData()

返回包含所有顶点属性的vtkDataSetAttributes结构。

data = GetEdgeData()

返回包含所有边属性的vtkDataSetAttributes结构。

pt = GetPoint(id)

返回特定顶点的位置,作为指向包含x-y-z坐标的数组的指针。

GetPoint(id, pt)

前一个方法的替代形式。坐标在作为第二个参数传递的变量中设置。

pts = GetPoints()

返回顶点的位置作为vtkPoints对象。设置顶点位置。

ComputeBounds()

计算图形的当前边界框。

bds = GetBounds()

返回图形边界作为一个六元素数组,值为x_min, x_max, y_min,Y_max, z_min, z_max。GetBounds(bds)前一种方法的替代形式。边界是在作为参数传递的变量中设置的。初始化一个vtkOutEdgeIterator类型的迭代器,迭代顶点v的所有出边。对于无向图,这将返回所有事件边。

deg = GetDegree(v)

返回顶点的度数,也就是连接到顶点的边的总数。

deg = GetOutDegree(v)

返回连接到顶点的外向边的数量。在无向图中,这是与它相连的边的总数。返回顶点的第i条输出边作为vtkOutEdgeType结构。

GetOutEdge(v, i, edge)

这是前一种方法的另一种形式,适用于包装语言。返回作为第三个参数传递的变量中的传出边,类型为vtkGraphEdge。初始化一个vtkInEdgeIterator类型的迭代器,迭代顶点v的所有传入边。对于无向图,这将返回所有事件边。

deg = GetInDegree(v)

返回连接到顶点的传入边的数量。在无向图中,这是与它相连的边的总数。作为vtkOutEdgeType结构返回顶点的第i个传入边。这是前一种方法的另一种形式,适用于包装语言。返回作为第三个参数传递的变量中的传入边,类型为vtkGraphEdge。初始化一个vtkAdjacentVertexIterator类型的迭代器,迭代一个顶点的所有外向顶点。对于无向图,这将返回所有相邻的顶点。初始化一个vtkEdgeListIterator类型的迭代器,遍历图中的所有边。

m = GetNumberOfEdges()

返回图中边的数目。初始化一个vtkvertexlisttiterator类型的迭代器,以遍历图中的所有顶点。

n = GetNumberOfVertices()

返回图中顶点的数目。

SetDistributedGraphHelper(helper)

为图形设置分布式图形helper,使图形能够分布在多个处理器上。

Helper的类型是vtkDistributedGraphHelper。当前的实现是vtkpbgldistributuedgraphhelper,它使用并行增强图形库实现分布式图形。有关使用分布式图的详细信息,请参阅这些类的文档。

helper = GetDistributedGraphHelper()

返回分布式图形帮助器。v = FindVertex(pedigree_id)返回谱系ID与参数匹配的顶点。ID作为vtkVariant传递,它可以采用任何类型,可以存储在VTK数组中。如果没有找到该ID的顶点,返回-1。

success = CheckedShallowCopy(g)

如果图形满足图的约束,则执行图g的浅拷贝,否则仅返回false。对于vtkGraph,此检查总是成功,但子类覆盖此行为以确保传入的图形通过额外的测试。

success = CheckedDeepCopy(g)

如果图满足图的约束,则执行图g的深度拷贝,否则仅返回false。对于vtkGraph,此检查总是成功,但子类覆盖此行为以确保传入的图形通过额外的测试。

ReorderOutVertices(v, list)

根据存储在vtkIdTypeArray中的列表重新排序顶点的外向顶点。这不会改变图的拓扑结构,只会改变数据结构的内部排序。

v = GetSourceVertex(e)

获取给定边索引的源顶点索引。第一次调用this或GetTargetVertex()时,图将为所有边构建一个从边索引到源顶点和目标顶点的映射数组。如果您可以访问诸如vtkOutEdgeType、vtkInEdgeType、vtkEdgeType或vtkGraphEdge之类的边缘类型,则应该优先使用这些方法,而不是使用这种方法,因为这种方法会消耗额外的内存。

v = GetTargetVertex(e)

类似于GetSourceVertex(),但检索边缘的源顶点。

SetEdgePoints(e, npts, pts)

通过提供一些点和包含每个点的x, y, z坐标的3-x-npts数组来设置路由边e的点。

GetEdgePoints(e, npts, pts)

通过设置作为第二个和第三个参数传递的点的数量和点的数组来获取路由边e的点。

n = GetNumberOfEdgePoints(e)

返回沿一条边的边点数目。

pt = GetEdgePoint(e, i)

获取沿边路径的第i个点作为指向x, y, z坐标值的指针。

ClearEdgePoints(e)

清除与边相关联的边点。

SetEdgePoint(e, i, pt)

将沿边路径的第i点设置为保存x, y, z坐标值的数组。

SetEdgePoint(e, i, x, y, z)

前一个方法的另一种形式,它将x, y, z坐标作为单独的参数传递。添加一个点到边缘路径的末端,作为保存x, y, z坐标值的数组。

AddEdgePoint(e, x, y, z)

前一个方法的另一种形式,它将x, y, z坐标作为单独的参数传递。

vtkDirectedGraph

vtkDirectedGraph是所有对边施加排序的图的超类,因此边(A,B)被视为与(B,A)不同。当使用CheckedShallowCopy()等方法复制图时,这种类型确保图结构是有效的有向图。没有其他的公共方法。

vtkUndirectedGraph

vtkUndirectedGraph是所有不强制排序边的图的超类,所以边
(A,B)等于一条边(B,A)。当使用CheckedShallowCopy()等方法复制图时,这种类型确保图结构是有效的无向图。没有其他的公共方法。

vtkMutableDirectedGraph和vtkMutableUndirectedGraph方法

可变图形类是唯一可以通过编程方式编辑其结构的图形类。这只涉及图的结构,因为可以在所有的图类中添加和删除顶点和边的属性,包括顶点和边的位置。

v = AddVertex()

向图中添加顶点并返回其索引。

v = AddVertex(properties)

使用存储在vtkVariantArray中的属性向图中添加顶点,并返回其索引。属性的顺序必须与数组添加到图顶点数据的顺序相匹配。

v = AddVertex(pedigree_id)

在vtkVariant中存储指定系谱id的图中添加顶点,并返回其索引。

e = AddEdge(u, v)

从顶点u到顶点v添加一条边,并以vtkEdgeType结构返回该边。从顶点u到顶点v添加一条边,并以vtkGraphEdge对象的形式返回。这个方法为包装语言提供了adddge (u, v)的功能。

e = adddge (u, v, properties)

添加一条从顶点u到顶点v的边,边属性存储在vtkVariantArray中,并将边作为vtkEdgeType结构返回。属性的顺序必须与数组添加到图的边缘数据的顺序相匹配。

e = AddEdge(u_pedigree, v, properties)

函数就像AddEdge(u, v, properties),除了第一个顶点是由它的谱系ID指定的。

e = AddEdge(u, v_pedigree, properties)

函数就像AddEdge(u, v, properties),除了第二个顶点是由它的谱系ID指定的。

e = AddEdge(u_pedigree, v_pedigree, properties)

函数就像AddEdge(u, v, properties),除了两个顶点都是由它们的谱系id指定的。

child = AddChild(parent)

仅在vtkMutableDirectedGraph中可用。从父顶点向新的子顶点添加一条外向边,并返回新的子顶点索引。这在使用vtkMutableDirectedGraph构建树时非常有用。

child = AddChild(parent, properties)

仅在vtkMutableDirectedGraph中可用。添加一条从父顶点到新的子顶点的外出边,属性存储在vtkVariantArray中,并返回新的子顶点索引。属性的顺序必须与数组添加到图顶点数据的顺序相匹配。除了上面提到的方法,vtkMutableDirectedGraph和vtkMutableUndirectedGraph有一组类似的方法来支持分布式图。这些方法是:

LazyAddVertex() LazyAddVertex(properties)

LazyAddVertex(pedigree_id)

LazyAddEdge(u, v, properties)

LazyAddEdge(u_pedigree,v, properties)

LazyAddEdge(u, v_pedigree,properties)

LazyAddEdge(u_pedigree,v_pedigree,properties)

LazyAddEdge(u_pedigree,v_pedigree,properties)

这些方法只对分布式图有效(即分布式辅助器是非空的图)。所有这些方法都像它们的对应方法一样工作,没有预先添加“Lazy”,除了如果新的顶点或边将由远程处理器拥有,则异步执行添加。在分布式帮助器上调用Synchronize()将刷新所有挂起的编辑。在添加两个端点都是非本地的边缘的情况下,这可能需要两次Synchronize()调用。

vtkDirectedAcyclicGraph

        vtkDirectedAcyclicGraph是一个约束有向图,其中边不形成有向环。一个环是在图中形成一个完整环的相邻边的序列。一个有向无环图定义了一组元素的偏序。除了在CheckedShallowCopy()中添加的约束之外,这个类与vtkDirectedGraph相同。

        要生成一个vtkDirectedAcyclicGraph,首先创建一个vtkMutableDirectedGraph实例。在添加适当的顶点和边以创建树之后,在vtkDirectedAcyclicGraph的实例上调用CheckedShallowCopy(),将可变图作为参数传递。这个方法将做两件事中的一件。如果图是一个有效的有向无环图,它将通过浅复制设置结构并返回true。如果发现图形包含一个循环,该方法将返回false。没有其他的公共方法。

vtkTree

        树是一种特殊类型的有向无环图,它是连通的(即没有不相交的片段),每个顶点都有一条传入边,除了一个没有传入边的顶点,这个顶点被称为树的根。这些约束的结果是,树是一个层次结构,根顶点位于顶部,边缘向下指向树的较低层次。除了在CheckedShallowCopy()中添加的约束之外,这个类与vtkDirectedGraph相同。

        要生成vtkTree,首先创建vtkMutableDirectedGraph的实例。在添加适当的顶点和边以创建树之后,在vtkTree的实例上调用CheckedShallowCopy(),将可变图作为参数传递。这个方法将做两件事中的一件。如果树是有效的,它将通过浅拷贝设置结构并返回true。如果它不是一个有效的树,它将返回false。没有其他的公共方法。

16.14表

vtkTable只是存储在数组中的列的集合。每个列都是按名称访问的,可以通过算法添加、修改或删除列。作为对vtkTable支持的一部分,该工具包现在包括鉴别联合(vtkVariant, vtkVariantArray)和字符串(vtkStdString和vtkStringArray)类型,以及已经在VTK中的数字类型。

vtkTable方法

Dump(width)

使用指定的列宽度将表写入标准输出。

data = GetRowData()

返回表的列作为vtkDataSetAttributes对象。

SetRowData(data)从vtkDataSetAttributes对象中设置表中的完整数据。

n = GetNumberOfRows()

表中的行数。

row = GetRow(i)

检索表的第i行作为vtkVariantArray

GetRow(i, row)

将表的第i行检索到指定为第二个参数的vtkVariantArray变量中。

SetRow(i, row)

从vtkVariantArray中设置表的第i行。

i = InsertNextBlankRow()

在表的底部插入一个空值(0和/或空字符串的数值)的新行,并返回新行的索引。

i = InsertNextRow(row)

插入一个新的行,从vtkVariantArray的值到表的底部,并返回新行的索引。

RemoveRow(i)

从表中删除第i行。删除行下面的行向上移动。

m = GetNumberOfColumns()

表中的列数。

name = GetColumnName(j)

返回第j列的名称。

arr = GetColumnByName(name)

返回具有指定名称的列作为vtkAbstractArray,如果不存在则返回null。

arr = GetColumn(j)

返回第j列作为vtkAbstractArray。

AddColumn(arr)

从vtkAbstractArray中添加一个列到表中。

RemoveColumnByName(name)

删除具有特定名称的列。

RemoveColumn(j)

删除表中的第j列。被删除列右侧的列将向左移动。

val = GetValue(i, j)

返回第i行和第j列的值作为vtkVariant。

val = GetValueByName(i, name)

返回第i行和列名处的值,作为vtkVariant。SetValue(i, j, val)设置第i行和第j列的值为vtkVariant。

SetValueByName(i, name, val)

设置第i行和列名处的值为vtkVariant。

16.15多维数组

        新的vtkArray类构成了稀疏和密集数组层次结构的基础,可以存储任意维度的数据。不同于vtkAbstractArray的衍生函数,vtkAbstractArray只能存储一维元组数组,vtkArray dimension可以存储向量(一维)、矩阵(二维)或张量(三维或更多维度)数据,使用各种存储方案。VTK目前为多维数组提供密集和稀疏坐标存储。未来版本的VTK可能会使用vtkArray来存储字段和属性数据。

        请注意,在构建VTK时,必须设置VTK_USE_N_WAY_ARRAYS“ON”,以启用多维数组类。目前,多维数组类没有被包装以供c++以外的语言使用。

vtkArray方法

vtkArray是一个纯虚拟基类,它声明了所有多维数组的通用方法,无论它们如何存储数据或存储什么类型的值。特别重要的是用于调整数组大小的函数,这些函数既指定数组中的维数,也指定数组沿每个维的大小。

extents = GetExtents()

返回数组的范围(维度数和每个维度的大小)。

dimensions = GetDimensions()

返回数组中存储的维度数。注意,这与调用GetExtents(). getdimensions()是一样的。

size = GetSize()

返回数组中存储的值的个数。请注意,这与调用GetExtents(). getsize()相同,并且表示使用当前区段可以存储的最大值数。这等于存储在密集数组中的值的数量,并且大于或等于存储在稀疏数组中的值的数量。

size = GetNonNullSize()

返回存储在数组中的非空值的个数。注意,对于密集数组,这个值等于GetSize(),对于稀疏数组,这个值小于或等于GetSize()。

SetDimensionLabel(i, label)

设置数组第i维的标签。

label = GetDimensionLabel(i)

返回数组第i维的标签。

GetCoordinatesN(n, coordinates)

返回数组中第n个值的坐标,其中n在[0,GetNonNullSize()]的范围内。请注意,访问坐标的顺序是未定义的,但保证与使用其他基于索引的数组值访问器访问值的顺序相匹配。

value = GetVariantValueN(n)

返回数组中存储的第n个值,其中n在[0,GetNonNullSize()]的范围内。

这对于有效访问数组中的每个值非常有用。注意,访问值的顺序是未定义的,但保证与vtkArray::GetCoordinatesN()使用的顺序匹配。

SetVariantValueN(n, value)

覆盖数组中存储的第n个值,其中n的取值范围为[0,GetNonNullSize()]。这对于有效访问数组中的每个值非常有用。注意,访问值的顺序是未定义的,但保证与vtkArray::GetCoordinatesN()使用的顺序匹配。

array = DeepCopy()

返回一个新的数组,它是这个数组的深度拷贝。

Resize(i) Resize(i, j) Resize(i, j, k) Resize(extents)

将数组大小调整到给定的区段(维度数和每个维度的大小)。注意,vtkArray的具体实现可能会对它们将存储的范围施加约束,因此您不能假设GetExtents()将始终返回传递给Resize()的相同值。在调用Resize()之后,数组的内容是未定义的——你应该相应地初始化它的内容。特别是,维度标签将是未定义的,密集数组值将是未定义的,而稀疏数组将为空。

value = GetVariantValue(i)

value = GetVariantValue(i, j)

value = GetVariantValue(i, j, k)

value = GetVariantValue(coordinates)

返回在给定坐标处存储在数组中的值。注意,提供的坐标中的维数必须与数组中的维数匹配。

SetVariantValue(i, j, value)

SetVariantValue(i, j, value)

SetVariantValue(i, j, k, value)

SetVariantValue(coordinates, value)

覆盖数组中存储在给定坐标处的值。注意,提供的坐标中的维数必须与数组中的维数匹配。

CopyValue(source, source_coordinates, target_coordinates)

CopyValue(source, source_index, target_coordinates)

CopyValue(source, source_coordinates, target_index)

提供坐标的地方,必须匹配对应数组的维数。用从另一个数组检索的值覆盖一个值。两个数组必须存储相同的数据类型。

vtkTypedArray方法

vtktypearray提供了一个特定于类型的接口,用于检索和更新任意维度数组中的数据。它派生自vtkArray,并以存储在数组中的值的类型为模板。
提供了基于数组坐标或一维整数索引检索和更新数组值的方法。后一种方法可用于以任意顺序遍历数组中的值,这在编写对稀疏进行有效操作的过滤器时非常有用数组和可以具有任意维数的数组。特殊的重载方法为一维、二维或三维数组提供了简单的访问。

value = GetValueN(n)

返回数组中存储的第n个值,其中n在[0,GetNonNullSize()]的范围内。这对于有效访问数组中的每个值非常有用。注意,访问值的顺序是未定义的,但保证与vtkArray::GetCoordinatesN()使用的顺序匹配。

SetValueN(n, value)

覆盖数组中存储的第n个值,其中n的取值范围为[0,GetNonNullSize()]。这对于有效访问数组中的每个值非常有用。注意,访问值的顺序是未定义的,但保证与vtkArray::GetCoordinatesN()使用的顺序匹配。

value = GetValue(i)

value = GetValue(i, j)

value = GetValue(i, j, k)

value = GetValue(coordinates)

返回在给定坐标处存储在数组中的值。注意,提供的坐标中的维数必须与数组中的维数匹配。

SetValue(i, j, value) SetValue(i, j, value)

SetValue(i, j, k, value)

SetValue(coordinates, value)

覆盖数组中存储在给定坐标处的值。注意,提供的坐标中的维数必须与数组中的维数匹配。

vtkDenseArray方法

vtkDenseArray是一个具体的vtkArray实现,它使用一个连续的内存块存储值。值以fortran顺序存储,这意味着如果在内存块上迭代,最左边的坐标变化最快。除了vtktypearray提供的检索和更新方法外,vtkDenseArray还提供了以下方法:

•用特定值填充整个数组,以及

•检索指向存储内存块的原始指针。

Fill(value)用给定的值填充数组中的每个元素。

reference = operator[](coordinates)

按引用返回值,这对性能和代码清晰度很有用。

ptr = GetStorage()

返回对底层存储的可变引用。值以fortran顺序连续存储。使用风险自负!

vtkSparseArray方法

vtkSparseArray是一个具体的vtkArray实现,使用稀疏坐标存储存储值。这意味着数组存储坐标稀疏存储的完整集合和数组中每个非空值的值,这种方法可以很好地推广到任意维数。除了vtkTypedArray提供的值检索和更新方法外,vtkSparseArray还提供了以下方法:

•获取和设置一个特殊的“null”值,该值将在检索未定义坐标的值时返回;

•清除数组的内容,使每一组坐标都是未定义的;

•在平摊常数时间内为数组添加值;

•调整数组范围的大小,以便它们在每个维度上绑定最大的非null值集;

•检索指向值和坐标存储内存块的指针。

SetNullValue(value)

设置GetValue()对数组中NULL区域返回的值。

value = GetNullValue()

返回GetValue()对于数组的NULL区域将返回的值。

Clear()

从数组中删除所有非空元素,保持维数、每个维的范围和每个维的标签不变。

ptr = GetCoordinateStorage()

返回对底层坐标存储的可变引用。在VTK 5.4中,GetCoordinateStorage()返回数组坐标作为一个连续的一维数组,组织使每个值的坐标在内存中相邻。在VTK 5.4之后,此方法已更改为将基于零的维度作为参数,返回该维度的连续坐标数组。使用风险自负!ptr = GetValueStorage()返回对底层值存储的可变引用。值是连续存储的,但顺序是任意的。如果需要获取值的相应坐标,请使用GetCoordinateStorage()。

使用风险自负!ReserveStorage(value_count)为特定数量的值保留存储空间。这对于使用GetCoordinateStorage()和GetValueStorage()读取外部数据非常有用,因为可以提前确定数组中非null值的总数。注意,在调用ReserveStorage()之后,所有坐标和值都是未定义的,因此必须确保覆盖每一组坐标和值。调用者有责任确保不将重复的坐标插入到数组中。

ResizeToContents()

更新数组范围以匹配其内容,以便每个维度上的范围与该维度上的最大索引值匹配。注意:ResizeToContents()在VTK 5.4之后的VTK版本中被重新标记为“SetExtentsFromContents()”。

AddValue(我,值)
AddValue(i, j, value)
AddValue(i, j, k, value)
AddValue(坐标,价值)
向数组中添加一个新的非空元素。不测试是否已经存在具有匹配坐标的元素。对于提供数组的快速初始化非常有用,只要调用者准备保证没有重复的坐标被使用。

vtkArrayData方法

        因为vtkArray不是从vtkDataObject派生出来的,所以多维数组类不能被流水线直接处理。相反,新的vtkArrayData类是一个vtkDataObject,作为多维数组的“容器”。有一个相应的vtkArrayDataAlgorithm类,用于实现在vtkArrayData上操作的管道源和过滤器。

        请注意,在VTK 5.4中,vtkArrayData是存储单个vtkArray的vtkDataObject,而vtkFactoredArrayData是存储一个或多个vtkArray实例的vtkDataObject。在VTK的后续版本中,这两个类已经合并,以便vtkArrayData是一个或多个vtkArray实例的容器。

array = GetArray()

返回vtkArrayData存储的vtkArray。

SetArray(array)

设置vtkArrayData存储的vtkArray。

本书为英文翻译而来,供学习vtk.js的人参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vtk用户指南》是一本介绍Visualization Toolkit(VTK)的使用和应用的指南,它提供了VTK的详细说明和说明,以便用户可以有效地利用VTK进行科学和工程可视化。该指南涵盖了VTK的各个方面,包括数据处理、可视化和交互式操作等内容。 VTK是一个强大的开源软件库,用于开发和呈现三维形和像的应用程序。它广泛应用于医学成像、地质学、气象学、工程建模等领域,因此《vtk用户指南》对于从事这些领域的科研人员和工程师来说是一本非常有价值的参考书籍。 该指南的中文版PDF能够帮助中国的VTK用户更方便地了解和使用VTK,提高他们的工作效率和成果。通过阅读《vtk用户指南》中文版PDF,用户可以学习VTK的基本概念、算法数据结构,了解VTK的特点和优势,并掌握VTK的基本操作和高级功能。 此外,该指南还介绍了VTK在实际项目中的应用示例,帮助用户更好地理解VTK在科学和工程领域的实际价值和作用。通过学习《vtk用户指南》,用户可以更好地利用VTK进行数据可视化和分析,为自己的研究和项目提供更好的支持和帮助。 总之,《vtk用户指南》中文版PDF是一本非常有用的参考资料,对于VTK用户和开发者来说具有重要的意义。阅读该指南能够帮助用户更好地了解和掌握VTK的使用和应用,为他们的工作和研究提供更好的支持和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值