使用vtkGenericDataObjectReader读取.vtk二进制文件

Read in .vtk binary file using vtkGenericDataObjectReader

本文关键字:二进制文件 vtk 读取 vtkGenericDataObjectReader 使用      更新时间:2023-10-16

我试图在c++中读取遗留的。vtk文件,并使用vtkGenericDataObjectReader(用于分子动力学模拟)填充我的数据结构。我已经搜索了文档,并从类似的问题中收集了答案,但我仍然误解了一些东西。这是文件。请原谅二进制,我认为它写对了,但我不排除它是问题所在。

# vtk DataFile Version 3.0
vtk output
BINARY
DATASET POLYDATA
FIELD FieldData 2
TIME 1 1  double
00000000CYCLE 1 1 int
0000POINTS 8 double
BFF0EDE4mD3B2BFF0EDE4mD3B2BFF0EDE4mD3B2BFF0EDE4mD3B2BFF0EDE4m    D3B2?F0EDE4mD3B2BFF0EDE4mD3B2?F0EDE4mD3B2BFF0EDE4mD3B2BFF0EDE4mD3B2?F0EDE4mD3B2?F0EDE4mD3B2?F0EDE4mD3B2BFF0EDE4mD3B2BFF0EDE4mD3B2?F0EDE4mD3B2BFF0EDE4mD3B2?F0EDE4mD3B2?F0EDE4mD3B2?F0EDE4mD3B2BFF0EDE4mD3B2?F0EDE4mD3B2?F0EDE4mD3B2?F0EDE4mD3B2VERTICES 8 16
0000000000000000000000000000000000000000000000000POINT_DATA 8
SCALARS mass  double
LOOKUP_TABLE default
@H000000@H000000@H000000@H000000@H000000@H000000@H000000@H000000VECTORS velocity  double
BFC09E   bD8_BFpB4Mz8BBFC1A3|9?B581`FACAk?C7NA4igBF94E5R,BE瀿C5wSbK8E?98l?E0AFϿCC381EEF1n*BFC3DA6EArf?B5ЖCDEF99?C1F1,9EF3CF?99=Aɕm"?B287l8996eU?A9E9cAA4[?BDD6FDA2ͿC5E9r}93B1BFB8X:aB86A4?BDBCEDBV֓BFA4AAa,~,?Č7CCR{?BCF499LB7YBFC3CD    WE4v(?BFOSD4f8B

这是我的代码。当试图执行'int rv = reader->ReadPoints(ps, int(num_particles));'

时,vtkDataReader::ReadString(char*)从/usr/lib/libvtkio . so5.8中分段错误
vtkSmartPointer<vtkGenericDataObjectReader> reader = 
      vtkSmartPointer<vtkGenericDataObjectReader>::New();
reader->SetFileName(in_rel_path.c_str());
reader->Update();
vtkPolyData* output = reader->GetPolyDataOutput();
vtkPointSet *ps = NULL;
size_t num_particles = output->GetNumberOfPoints();
int rv = reader->ReadPoints(ps, int(num_particles));
vtkPointData* pd = output->GetPointData();
vtkDoubleArray* vel_data = vtkDoubleArray::SafeDownCast(pd->GetVectors());
vtkDoubleArray* mass_data = vtkDoubleArray::SafeDownCast(pd->GetScalars());
vtkDoubleArray* time_data = vtkDoubleArray::SafeDownCast(pd->GetArray("TIME"));
vtkIntArray* cycle_data = vtkIntArray::SafeDownCast(pd->GetArray("CYCLE"));
tot_iters = cycle_data->GetValue(0);
particles.resize(0);
double* position = new double[3];
double* velocity = new double[3];
for( size_t i = 0; i < num_particles; i++ )
{
  ps->GetPoint(int(i), position);
  vel_data->GetTupleValue(int(i), velocity);
  double pmass = mass_data->GetValue(int(i));
  particles.push_back(Particle(vec3(position[0],position[1],position[2]),
                 vec3(velocity[0],velocity[1],velocity[2]),
             pmass));
}
delete[] position;
delete[] velocity;
我承认我对VTK了解不多。如果有人能帮我解释一下我做错了什么,或者有更好的方法来解决这个问题,我将非常感激。

读取PolyData的最佳选择是使用vtkPolyDataReader类。但是如果你读了类文档,它们给出了以下关于二进制文件的警告在一个系统上写入的二进制文件在其他系统上可能无法读取。

下面是一个例子,取自VTK Wiki,读取。VTK文件

#include <vtkPolyDataReader.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
int main ( int argc, char *argv[] )
{
   // Parse command line arguments
   if(argc != 2)
   {
   std::cerr << "Usage: " << argv[0]
             << " Filename(.vtk)" << std::endl;
   return EXIT_FAILURE;
   }
   std::string filename = argv[1];  
   // Read all the data from the file
  vtkSmartPointer<vtkPolyDataReader> reader =
  vtkSmartPointer<vtkPolyDataReader>::New();
  reader->SetFileName(filename.c_str());
  reader->Update();
  // Visualize
  vtkSmartPointer<vtkPolyDataMapper> mapper =
  vtkSmartPointer<vtkPolyDataMapper>::New();
  mapper->SetInputConnection(reader->GetOutputPort());
  vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); 
  actor->SetMapper(mapper);
  vtkSmartPointer<vtkRenderer> renderer =
  vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow =
  vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
  vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);
  renderer->AddActor(actor);
  renderer->SetBackground(.3, .6, .3); // Background color green
  renderWindow->Render();
  renderWindowInteractor->Start();
  return EXIT_SUCCESS;
}