x,y,z点的vtk值

DrW*_*les 2 c++ vtk

我有一个vtk将温度映射为3维的文件。我想确定给定x,y,z点的温度。我将使用以下代码来加载vtk文件(读取.vtk文件):

int main(int argc, char *argv[]) 
{
  // simply set filename here (oh static joy)
  std::string inputFilename = "setYourPathToVtkFileHere";

  // Get all data from the file
  vtkSmartPointer<vtkGenericDataObjectReader> reader =
        vtkSmartPointer<vtkGenericDataObjectReader>::New();
  reader->SetFileName(inputFilename.c_str());
  reader->Update();

  // All of the standard data types can be checked and obtained like this:
  if (reader->IsFilePolyData()) 
  {
    std::cout << "output is a polydata" << std::endl;
    vtkPolyData* output = reader->GetPolyDataOutput();
    std::cout << "output has " << output->GetNumberOfPoints() << "     points." << std::endl;
  }

  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

但是,在库中搜索大量方法时,vtk我找不到合适的函数来提取特定位置的值。有什么建议么?

QnD*_*QnD 5

在给定位置检索标量值的正确方法取决于两个问题:

  1. 您的数据如何布置以及
  2. 您要从哪个位置检索属性

关于数据布局,主要有两种布局:

  • 结构化:数据驻留在统一的网格中
  • 非结构化:点样本是任意的

关于职位,您可以有两种情况:

  • 在样本位置进行查询:您要求的点直接是数据集中的样本
  • 在任意位置查询:您要求的点在您的域中某处,但不一定与数据样本一致。

与数据布局无关,要在示例位置(即原始数据集的示例)检索数据,可以使用vtkPointLocator类。使用以下类(未经测试):

// Build locator object
vtkSmartPointer<vtkPointLocator> locator = vtkPointLocator::New();
locator->SetDataSet(polyData);
locator->BuildLocator();
// Define query position
double pt[3] = {0.1, 0.2, 0.3};
// Get the ID of the point that is closest to the query position
vtkIdType id = locator->FindClosestPoint(pt);
// Retrieve the first attribute value from this point
double value = polyData->GetPointData()->GetScalars()->GetTuple(id, 0);
Run Code Online (Sandbox Code Playgroud)

这将为您提供最接近的数据样本的点值。 请注意,这不会为您提供该点在数据集中的明确位置,因为它是隐式编码在变量id中的。要检索最接近点的实际位置,可以编写:

double *dataPt = polyData->GetPoint(id);
Run Code Online (Sandbox Code Playgroud)

如果要在域的任意位置检索数据,则需要某种插值方式。在这里,数据布局很重要。

  • 对于结构化数据,您可以先将数据转换为vtkImage,然后对它执行查询。如果要使用线性或三次方案检索插值属性,可以在过滤器链中添加vtkImageInterpolator,然后使用GetScalarComponentAsDouble方法检索点。
  • 对于非结构化数据,您应该首先确定插值方案。vtk具有各种过滤器,可从数据样本中重建连续数据。选项包括Delaunay三角剖分/四面体化(vtkDelaunay2D,vtkDelaunay3D)以及Shepard方法(vtkShepardMethod)。两种方法都可以为您提供一个新的数据集,并可以查询任意点。如果要检索(一批)点的标量属性而没有实际重建完整的数据集,则还可以查看vtkProbeFilter。