第01章 17 在vtkDataSet中访问Point Data和Cell Data
在 VTK 中,为了高效地管理和访问 Point Data
(点数据)和 Cell Data
(单元数据),VTK 提供了专门的设计机制。这些机制使得用户可以方便地从 vtkDataSet
中获取和操作这些数据。以下是 VTK 中用于处理 Point Data
和 Cell Data
的核心概念和方法。
1. vtkDataSet
中的数据结构
vtkDataSet
是 VTK 中所有数据集的基类,它不仅存储了几何信息(点、单元),还存储了与这些几何信息关联的属性数据(Point Data
和 Cell Data
)。为了方便管理和访问这些数据,VTK 设计了以下核心组件:
(1) vtkPointData
- 含义:存储与点关联的属性数据。
- 用途:可以存储点的标量、矢量、张量、标量场、矢量场等数据。
- 访问方法:通过
vtkDataSet::GetPointData()
获取vtkPointData
对象。
(2) vtkCellData
- 含义:存储与单元(几何形状的基本组成元素)关联的属性数据。
- 用途:可以存储单元的标量、矢量、张量、标量场、矢量场等数据。
- 访问方法:通过
vtkDataSet::GetCellData()
获取vtkCellData
对象。
2. 访问 Point Data
和 Cell Data
的具体方法
以下是一些常用的方法,用于从 vtkDataSet
中获取 Point Data
和 Cell Data
。
(1) 获取 vtkPointData
和 vtkCellData
对象
vtkPointData* pointData = dataSet->GetPointData();
vtkCellData* cellData = dataSet->GetCellData();
vtkPointData
和vtkCellData
是vtkDataSet
的成员变量,分别用于存储点数据和单元数据。
(2) 添加/获取标量数据
// 创建标量数据(例如温度场)
vtkNew<vtkDoubleArray> temperatureArray;
temperatureArray->SetName("Temperature"); // 设置数据名称
temperatureArray->SetNumberOfComponents(1); // 设置数据维度(标量)
temperatureArray->SetNumberOfTuples(numPoints); // 设置数据点数
// 将标量数据添加到 Point Data
pointData->AddArray(temperatureArray);
// 获取标量数据
vtkDataArray* retrievedArray = pointData->GetArray("Temperature");
AddArray()
用于添加数据。GetArray()
用于获取数据。
(3) 设置活动标量/矢量
// 设置活动标量
pointData->SetActiveScalars("Temperature");
// 设置活动矢量
pointData->SetActiveVectors("Velocity");
SetActiveScalars()
和SetActiveVectors()
用于指定当前使用的标量场或矢量场。
(4) 获取单元数据
// 获取单元数据(例如单元类型)
vtkIdType cellId = 0; // 单元索引
vtkCell* cell = dataSet->GetCell(cellId);
int cellType = cell->GetCellType();
GetCell()
用于获取单元的几何信息。GetCellType()
用于获取单元的类型。
3. vtkPointData
和 vtkCellData
的设计机制
vtkPointData
和 vtkCellData
的设计遵循以下原则,以提高数据管理的灵活性和效率:
(1) 数据数组管理
vtkPointData
和vtkCellData
实际上是vtkFieldData
的子类,vtkFieldData
是一个通用的数据数组容器。- 它们使用
vtkDataArray
(或其子类)来存储具体的属性数据。 - 每个
vtkDataArray
可以存储标量、矢量、张量等不同类型的数据。
(2) 数据数组的操作
- 支持添加、删除、查询和修改数据数组。
- 提供方法以指定活动数据(如标量或矢量)。
(3) 数据与几何的绑定
Point Data
与数据集中的点一一对应。Cell Data
与数据集中的单元一一对应。- 通过索引(
vtkIdType
)快速访问对应的数据。
4. 示例代码
以下是一个完整的示例,展示如何向 vtkDataSet
添加 Point Data
和 Cell Data
,以及如何访问这些数据。
#include <vtkNew.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkDoubleArray.h>
int main() {
// 创建点
vtkNew<vtkPoints> points;
points->InsertNextPoint(0.0, 0.0, 0.0);
points->InsertNextPoint(1.0, 0.0, 0.0);
points->InsertNextPoint(0.5, 1.0, 0.0);
// 创建单元(三角形)
vtkNew<vtkCellArray> cells;
vtkNew<vtkIdList> idList;
idList->InsertNextId(0);
idList->InsertNextId(1);
idList->InsertNextId(2);
cells->InsertNextCell(idList);
// 创建数据集(多边形数据)
vtkNew<vtkPolyData> polyData;
polyData->SetPoints(points);
polyData->SetPolys(cells);
// 添加 Point Data(温度场)
vtkNew<vtkDoubleArray> temperatureArray;
temperatureArray->SetName("Temperature");
temperatureArray->SetNumberOfComponents(1);
temperatureArray->SetNumberOfTuples(3); // 3 个点
temperatureArray->SetValue(0, 20.0);
temperatureArray->SetValue(1, 25.0);
temperatureArray->SetValue(2, 30.0);
polyData->GetPointData()->AddArray(temperatureArray);
// 添加 Cell Data(标量场)
vtkNew<vtkDoubleArray> cellScalarArray;
cellScalarArray->SetName("CellScalar");
cellScalarArray->SetNumberOfComponents(1);
cellScalarArray->SetNumberOfTuples(1); // 1 个单元
cellScalarArray->SetValue(0, 100.0);
polyData->GetCellData()->AddArray(cellScalarArray);
// 打印数据集信息
polyData->Print(std::cout);
// 获取 Point Data 并打印
vtkDataArray* retrievedTempArray = polyData->GetPointData()->GetArray("Temperature");
if (retrievedTempArray) {
for (vtkIdType i = 0; i < retrievedTempArray->GetNumberOfTuples(); ++i) {
std::cout << "Point " << i << " Temperature: " << retrievedTempArray->GetTuple1(i) << std::endl;
}
}
// 获取 Cell Data 并打印
vtkDataArray* retrievedCellArray = polyData->GetCellData()->GetArray("CellScalar");
if (retrievedCellArray) {
for (vtkIdType i = 0; i < retrievedCellArray->GetNumberOfTuples(); ++i) {
std::cout << "Cell " << i << " Scalar: " << retrievedCellArray->GetTuple1(i) << std::endl;
}
}
return 0;
}
输出结果
Point 0 Temperature: 20
Point 1 Temperature: 25
Point 2 Temperature: 30
Cell 0 Scalar: 100
5. 总结
vtkPointData
和vtkCellData
是 VTK 中用于管理和访问与点或单元关联的属性数据的类。- 通过
vtkDataSet::GetPointData()
和vtkDataSet::GetCellData()
可以获取对应的vtkPointData
和vtkCellData
对象。 vtkPointData
和vtkCellData
支持添加、删除、查询和修改数据数组。- 这些机制使得 VTK 能够高效地处理复杂的科学数据,并支持丰富的可视化和分析操作。
原文地址:https://blog.csdn.net/joshua0137/article/details/145284093
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!