VTK对属性参数的设置,以及用vtkFieldData存储属性数据的方法

VTKPlaneSource定义了一个3*3的网格数据。cellScalars定义了vtkFloatArray类型的标量属性数据,默认情况下其元组大小为1,因此不需要显示指定其大小;cellVectors则定义了vtkFloatArray类型的矢量属性数组,通过SetNumberOfComponents()指定向量维数为3,并通过InsertNextTuple3()可以方便地插入向量数据。

定义完毕后,vtkPolyData的单元数据(VTKCellData)通过调用函数SetScalars()和SetVectors()设置相应的属性数据和标量数据

为了进一步演示利用标量数据进行颜色映射,定义了一个具有10个颜色的颜色映射表。利用vtkPolyDataMapper类的SetLookupTable()函数设置定义的颜色映射表。另外,需要注意的是,SetScalarRange()指定了颜色映射范围的最小值和最大值,当标量值大于最大值时,按定义最大值获取颜色;当小鱼最小值时,按照指定的最小值获取颜色。这样做的一个好处是,可以在一个小的标量范围内显示更多的颜色!!!

该例的输出结果为:

    数据集的属性(属性数据)是与数据集结构相关联的。而数据集又是建立在点和单元的基础上,所以数据属性很自然地是与点和单元相关联。即每个点每个单元都有与其对应的数据属性。

      数据属性的值称为属性数据。属性数据一般设置为一些有实际意义的值,如在某点处的温度(用一个数值表示),或在某点处所受的力(用三个数值表示)等。点或单元的属性数据是以数据数组(vtkDataArray)的形式进行存储的,根据数据值类型的不同,具体是存储 在vtkDataArray的子类中,如vtkFloatArrayvtkIntArray等。数组的每个元素称为元组,对应着但个点或单元的属性数据。每个元组可以有多个分量(Component),例如速度值就有分别沿着x,y,z轴的三个分量。数组的长度必须与点或单元的个数相同,这样才能保证与点或单元一一对应。

  在插入各个数据前,元组的个数可以不指定。这样的话,就必须调用名字前缀为Insert的方法插入数据(注意最终插入的元组个数必须等于点或单元的个数)。如果制定了元组个数的话,就可以调用名字前缀为Set的方法,该方法相对较快些。方法名后缀的数字表示的是元组中分量的个数,该数字与SetNumberOfComponents()参数一致,默认分量个数为1.

  设定每个元组数据时,需提供若干个参数,第一个是点ID号,之后是元组各个分量的值。设置元组数据还有很多种方法可供选择。

  首先需要调用数据集的方法GetPointData()或者GetCellData()获取点或单元数据,接着调用方法SetScalars()和SetVectors()将数据数组作为特殊属性数据存储

  这两个方法分别设置的是标量属性数据和矢量属性数据(其他特殊属性数据还包括法向量属性数据、纹理坐标属性数据和张量属性数据,分别用方法SetNormals()、SetTCoords()和SetTensors()设置)。

   最后调用AddArray()将数据数组作为一般属性数据添加进数据集中。该方法可以多次调用从而添加多个数据数组。正是由于一般属性数据没有数量上的限制,所以使用字符串名字来进行区分会方便些。

  在VTK中用vtkPointData类和vtkCellData类表达数据集属性,它们是类vtkFieldData的子类,构成数据集的每个点(或单元)和属性数据之间存在一对一的关系,如一个数据集由N个点(或单元)构成,那么必须有N个属性数据和这N个点(或单元)一一对应,通过点的ID号就可以对该点的属性数据进行访问,例如在数据集aDataSet中访问ID号为129的点的标量值时(假设标量数据已被定义且不为空)使用如下方法: 

aDataSet->GetPointData()->GetScalars()->GetScalar(55)。

几何结构points和拓扑结构Cell数据。

点和拓扑结构的指定:

属性数据的指定:

 先用5个空间中的点,用构建了一个长方形和一个三角形:

然后给这些点和cell加入颜色属性设置:


vtkFieldData(好像已经用不到了)

vtkFieldData用来存储数据的属性数据,该数据是对拓扑结构和几何结构信息的补充。属性数据可以是某个空间点的温度或某个单元的质量等。在vtk中与数据集的点数据相关联的属性数据用vtkPointData表达,与单元数据相关联的属性数据用vtkCellData表达。 

 vtkFieldData表示和操作数据的字段。字段的模型是一个m × n的数据值矩阵,其中m是元组的数量,n是组件的数量。(元组是矩阵中包含n个元素的一行。)该字段假定是由一个或多个数据数组组成的集合,其中数组中的数据是不同类型的(例如,int, double, char等),并且每个数组中可能有不同数量的组件。注意,假设每个数据数组的长度为“m”(即元组的数量),这通常对应于数据集中的点或单元格的数量。此外,每个数据数组必须有一个字符串名称。(用于操作数据。)


vtkDataSetAttributes是一个用于表示和操作属性数据(例如,标量、向量、法线、纹理坐标、张量、全局id、谱系id和字段数据)的类。这为vtkFieldData增加了从字段中选择一个数组作为每个属性类型的当前活动数组的能力。

此外,vtkDataSetAttributes提供了筛选调用的方法,这些调用通过字段传递数据、将数据复制到字段中以及从字段中插入数据。PassData将整个数组从源传递到目标。复制将元组的某个子集从源传递到目标。Interpolate使用提供的权重从源数据中选择的元组进行插值,以在目标数据中生成新的元组。每个属性类型都有传递、复制和插值“复制”标志,即可以在目标中设置,以选择将哪些属性数组从源传输到目标。

最后,该类提供了一种机制来确定一组源具有哪些共同属性,并将元组从源复制到目标,只针对所有源都拥有的那些属性。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
我们可以使用VTK的Python接口来显示点的属性值。首先,需要加载点云数据,可以使用`vtk.vtkPCDReader()`来读取`.pcd`格式的点云数据。然后,我们可以创建一个`vtk.vtkLookupTable()`对象来为每个点的属性值指定颜色。接下来,使用`vtk.vtkPolyDataMapper()`和`vtk.vtkActor()`来将数据可视化,并将属性值映射到颜色上。 以下是一个示例代码: ```python import vtk # Load point cloud data reader = vtk.vtkPCDReader() reader.SetFileName("point_cloud.pcd") reader.Update() # Create lookup table for color mapping lut = vtk.vtkLookupTable() lut.SetNumberOfColors(256) lut.SetHueRange(0.0, 0.667) lut.SetSaturationRange(1.0, 1.0) lut.SetValueRange(1.0, 1.0) lut.Build() # Create mapper and actor mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(reader.GetOutputPort()) mapper.SetScalarRange(reader.GetOutput().GetPointData().GetArray("intensity").GetRange()) mapper.SetLookupTable(lut) actor = vtk.vtkActor() actor.SetMapper(mapper) # Create render window and interactor renderer = vtk.vtkRenderer() renderer.SetBackground(0.1, 0.2, 0.4) renderer.AddActor(actor) renderWindow = vtk.vtkRenderWindow() renderWindow.SetSize(800, 600) renderWindow.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) # Start interaction renderWindow.Render() interactor.Start() ``` 在上面的代码中,我们假设点的属性存储在名为“intensity”的VTK数组中。如果您的数据有不同的属性值,请相应地更改代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值