x,y,z 点处的 VTK 值
vtk value at x,y,z point
本文关键字:VTK 更新时间:2023-10-16
我有一个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;
}
但是,在搜索vtk
库中广泛的方法列表时,我找不到适当的函数来提取特定位置的值。有什么建议吗?
在
给定位置检索标量值的正确方法取决于两个问题:
- 您的数据如何布局以及
- 要从哪个位置检索属性
关于数据布局,有两种主要布局:
- 结构化:数据驻留在统一的网格中
- 非结构化:点样本是任意的
关于职位,您可以有两种情况:
- 在示例位置查询:您请求的点直接是数据集中的示例
- 任意位置查询:您请求的点位于您网域中的某个位置,但不一定与数据样本一致。
与数据布局无关,要检索样本位置的数据(即原始数据集的样本(,您可以使用 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);
这将为您提供最接近的数据样本的点值。请注意,这不会为您提供点在数据集中的显式位置,因为它隐式编码在变量 id 中。要检索最近点的实际位置,您可以编写:
double *dataPt = polyData->GetPoint(id);
如果要在域的任意位置检索数据,则需要某种插值方式。在这里,数据布局很重要。
- 对于结构化数据,您可以先将数据转换为 vtkImage,然后对其执行查询。如果要使用线性或三次方案检索插值属性,可以在筛选器链中添加 vtkImage插值器,然后使用 GetScalarComponentAsDouble 方法检索点。
- 对于非结构化数据,应首先确定插值方案。 VTK 具有各种过滤器,用于从数据样本中重建连续数据。选项包括Delaunay 三角测量/四面体化(vtkDelaunay2D,vtkDelaunay3D(以及Shepard方法(vtkShepardMethod(。这两种方法都会为您提供一个新的数据集,可以查询任意点。如果要检索(一批(点的标量属性而不实际重建完整的数据集,还可以查看 vtkProbeFilter。
您需要首先从读取器中提取 polyData。然后,通过vtkPolyData::getPoints
将点存储到vtksmartPointer<vtkPoints>
中。最后,创建自定义结构的std::vector
,并在迭代 vtkPoint 时存储它们。
这里有一些代码来说明:
#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;
}
以下是QnD的答案中提到的vtkPointLocator的版本:
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;
}
还有CMakeList.txt
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()
如果我需要执行任何特定操作以正确记入其他答案,请告诉我。我是新来的,还不知道所有的细节。
相关文章:
- 没有找到相关文章