Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ x、y、z点处的vtk值_C++_Vtk - Fatal编程技术网

C++ x、y、z点处的vtk值

C++ x、y、z点处的vtk值,c++,vtk,C++,Vtk,我有一个vtk文件,它在3维中映射温度。我想确定给定x,y,z点的温度。我将使用以下代码加载vtk文件(): intmain(intargc,char*argv[]) { //只需在此处设置文件名(哦,静态快乐) std::string inputFilename=“setyourpatotovtkfilehere”; //从文件中获取所有数据 VTKSmart指针读取器= vtkSmartPointer::New(); reader->SetFileName(inputFilename.c_s

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

intmain(intargc,char*argv[])
{
//只需在此处设置文件名(哦,静态快乐)
std::string inputFilename=“setyourpatotovtkfilehere”;
//从文件中获取所有数据
VTKSmart指针读取器=
vtkSmartPointer::New();
reader->SetFileName(inputFilename.c_str());
阅读器->更新();
//所有标准数据类型都可以通过以下方式进行检查和获取:
如果(读卡器->IsFilePolyData())
{

std::cout您需要首先从读取器中提取polyData。然后,通过
vtkPolyData::getPoints
将点存储到
vtksmartPointer
中。 要完成此操作,请创建自定义结构的
std::vector
,并在迭代vtkPoints时存储它们

下面是一些代码来说明:

#include <vtkDataArray.h>
#include <vtkDataSet.h>
#include <vtkGenericDataObjectReader.h>
#include <vtkPointLocator.h>
#include <vtkPointData.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkStructuredGrid.h>
#include <string>


struct Pnt {
    double x_, y_, z_;
    Pnt(double x, double y, double z) : x_(x), y_(y), z_(z) {}
};

    int main ( int argc, char *argv[] )
{
  // Ensure a filename was specified
  if(argc != 2)
    {
    std::cerr << "Usage: " << argv[0] << " InputFilename" << endl;
    return EXIT_FAILURE;
    }

  // 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();

  vtkSmartPointer<vtkPolyData> polydata = reader->GetPolyDataOutput();
  vtkSmartPointer<vtkPoints> vtk_points = polydata->GetPoints();

  std::vector<Pnt> my_points;
  for (int i = 0; i < vtk_points->GetNumberOfPoints(); i++){
      const auto pnt = vtk_points->GetPoint(i);
      my_points.emplace_back(pnt[0], pnt[1], pnt[2]);
  }

  return EXIT_SUCCESS;
}

请告诉我是否需要执行任何特定操作才能正确地相信其他答案。我是新手,还不知道所有细节。

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

  • 您的数据是如何布局的
  • 要从哪个位置检索属性
  • 关于数据布局有两种主要布局:

    • 结构化:数据驻留在统一的网格中
    • 非结构化:点采样是任意的
    关于位置您可以有两种情况:

    • 在样本位置查询:您请求的点直接是数据集中的样本
    • 在任意位置进行查询:您请求的点位于域中的某个位置,但不一定与数据样本一致
    独立于数据布局,要在样本位置(即原始数据集的样本)检索数据,可以使用vtkPointLocator类。按如下方式使用该类(未测试):

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

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

    cmake CMakeLists.txt感谢dutiona。如果下面的后续问题是无意识的,我深表歉意,但是我是VTK库的新手。我尝试了以下代码和生成方法(以及许多变体)但仍然会出现编译错误。我假设我没有在CMakeLists.txt文件中包含正确的标题或添加正确的库。您好,我将争取一些时间在明天的工作中完整地编写一个工作示例。我在家里没有编译vtk,这需要很多时间。您必须使用setActiveScalar(“temp”)吗是否有多个标量可用?
    #include <vtkDataArray.h>
    #include <vtkDataSet.h>
    #include <vtkGenericDataObjectReader.h>
    #include <vtkPointLocator.h>
    #include <vtkPointData.h>
    #include <vtkPolyData.h>
    #include <vtkSmartPointer.h>
    #include <vtkStructuredGrid.h>
    #include <string>
    
    
    struct Pnt {
        double x_, y_, z_;
        Pnt(double x, double y, double z) : x_(x), y_(y), z_(z) {}
    };
    
        int main ( int argc, char *argv[] )
    {
      // Ensure a filename was specified
      if(argc != 2)
        {
        std::cerr << "Usage: " << argv[0] << " InputFilename" << endl;
        return EXIT_FAILURE;
        }
    
      // 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();
    
      vtkSmartPointer<vtkPolyData> polydata = reader->GetPolyDataOutput();
      vtkSmartPointer<vtkPoints> vtk_points = polydata->GetPoints();
    
      std::vector<Pnt> my_points;
      for (int i = 0; i < vtk_points->GetNumberOfPoints(); i++){
          const auto pnt = vtk_points->GetPoint(i);
          my_points.emplace_back(pnt[0], pnt[1], pnt[2]);
      }
    
      return EXIT_SUCCESS;
    }
    
    int main(int argc, char *argv[])
    {
        // Ensure a filename was specified
        if (argc != 2)
        {
            std::cerr << "Usage: " << argv[0] << " InputFilename" << endl;
            return EXIT_FAILURE;
        }
    
        // 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();
    
        vtkSmartPointer<vtkPolyData> polydata = reader->GetPolyDataOutput();
    
        //Building locator
        vtkSmartPointer<vtkPointLocator> locator = vtkPointLocator::New();
        locator->SetDataSet(polydata);
        locator->BuildLocator();
    
        //Finding point
        const double pt[3] = { 0.1, 0.2, 0.3 };
        vtkIdType id = locator->FindClosestPoint(pt);
        double pnt_found[3];
        polydata->GetPointData()->GetScalars()->GetTuple(id, pnt_found);
    
        return EXIT_SUCCESS;
    }
    
    cmake_minimum_required(VERSION 2.8)
    
    PROJECT(GenericDataObjectReader)
    
    find_package(VTK REQUIRED)
    include(${VTK_USE_FILE})
    
    add_executable(GenericDataObjectReader MACOSX_BUNDLE GenericDataObjectReader)
    
    if(VTK_LIBRARIES)
      target_link_libraries(GenericDataObjectReader ${VTK_LIBRARIES})
    else()
      target_link_libraries(GenericDataObjectReader vtkHybrid vtkWidgets)
    endif()
    
    // 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);
    
    double *dataPt = polyData->GetPoint(id);