自学内容网 自学内容网

第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)!