polydata标量数学运算_vtkArrayCalculator


开发环境:

  1. Windows 11 家庭中文版
  2. Microsoft Visual Studio Community 2019
  3. VTK-9.3.0.rc0
  4. vtk-example
  5. 参考代码

demo解决问题:关键类vtkArrayCalculator, 对polydata中集合单元数组坐标进行算数运算,通过具名数组(内部估计是用map实现)指定需要运算的对象、计算字符串(需要了解复杂字符串如何进行解析)、计算结果保存目标数组,个人觉得应用场景会比较少,可能更多的是直接loop进行数组计算赋值

  1. 首先在三维空间中创建一组 3 个点和一个名为 "orig "的双数组,其中包含三个值: 1.0、2.0 和 3.0。

  2. 设置 PolyData
    然后构建一个 vtkPolyData 对象来保存点及其相关数据。
    数组计算

  3. 代码会使用 vtkArrayCalculator 设置两个数组计算:
    第一个计算 (calc1) 将 "orig "数组中的每个值加 1。
    第二个计算 (calc2) 检查 "orig "数组中的每个值,如果值是 2,则赋值 1,否则保留原值。
    迭代和输出结果:

每次计算后,代码都会访问结果数组并遍历其值,然后将其输出到控制台。
该程序主要演示了使用 VTK 对三维空间中与点相关的数据执行数组计算的过程。这些计算可用于各种目的,例如修改或从与 VTK 数据集中的点相关联的现有数组中导出新数据。

  vtkNew<vtkArrayCalculator> calc1;
  calc1->SetInputData(polydata);
  calc1->AddScalarArrayName("orig");
  calc1->SetFunction("orig+1");
  calc1->SetResultArrayName("orig");
  calc1->Update();
  vtkNew<vtkArrayCalculator> calc2;
  calc2->SetInputData(polydata);
  calc2->AddScalarArrayName("orig");
  calc2->SetFunction("if(orig=2,1,orig)");//这里需要了解如何解析字符串
  calc2->SetResultArrayName("new");
  calc2->Update();

prj name: ArrayCalculator

#include 
#include 
#include 
#include 
#include 

#include 
#include 

/*
output1 value 0: 2
output1 value 1: 3
output1 value 2: 4
output2 value 0: 1
output2 value 1: 1
output2 value 2: 3
*/
int main(int, char*[])
{
  vtkNew<vtkPoints> points;
  points->InsertNextPoint(1.0, 0.0, 0.0);
  points->InsertNextPoint(2.0, 0.0, 0.0);
  points->InsertNextPoint(3.0, 0.0, 0.0);

  vtkNew<vtkDoubleArray> array;
  array->SetName("orig");
  array->InsertNextValue(1.0);
  array->InsertNextValue(2.0);
  array->InsertNextValue(3.0);

  vtkNew<vtkPolyData> polydata;
  polydata->SetPoints(points);
  polydata->GetPointData()->AddArray(array);

  vtkNew<vtkArrayCalculator> calc1;
  calc1->SetInputData(polydata);
  calc1->AddScalarArrayName("orig");
  calc1->SetFunction("orig+1");
  calc1->SetResultArrayName("orig");
  calc1->Update();

  auto output1 = dynamic_cast<vtkDoubleArray*>(
      calc1->GetPolyDataOutput()->GetPointData()->GetArray("orig"));

  for (vtkIdType i = 0; i < output1->GetNumberOfTuples(); i++)
  {
    double val = output1->GetValue(i);
    cout << "output1 value " << i << ": " << val << endl;
  }

  vtkNew<vtkArrayCalculator> calc2;
  calc2->SetInputData(polydata);
  calc2->AddScalarArrayName("orig");
  calc2->SetFunction("if(orig=2,1,orig)");//这里需要了解如何解析字符串的???
  calc2->SetResultArrayName("new");
  calc2->Update();

  auto output2 = dynamic_cast<vtkDoubleArray*>(
      calc2->GetPolyDataOutput()->GetPointData()->GetArray("new"));

  for (vtkIdType i = 0; i < output2->GetNumberOfTuples(); i++)
  {
    double val = output2->GetValue(i);
    cout << "output2 value " << i << ": " << val << endl;
  }

  return EXIT_SUCCESS;
}

你可能感兴趣的:(vtk,计算机视觉,c++)