使用vtkGenericDataObjectReader读取.vtk二进制文件
Read in .vtk binary file using vtkGenericDataObjectReader
我试图在c++中读取遗留的。vtk文件,并使用vtkGenericDataObjectReader(用于分子动力学模拟)填充我的数据结构。我已经搜索了文档,并从类似的问题中收集了答案,但我仍然误解了一些东西。这是文件。请原谅二进制,我认为它写对了,但我不排除它是问题所在。
# vtk DataFile Version 3.0
vtk output
BINARY
DATASET POLYDATA
FIELD FieldData 2
TIME 1 1 double
0 0 0 0 0 0 0 0CYCLE 1 1 int
0 0 0 0POINTS 8 double
BFF0EDE4mD3B2BFF0EDE4mD3B2BFF0EDE4mD3B2BFF0EDE4mD3B2BFF0EDE4m D3B2?F0EDE4mD3B2BFF0EDE4mD3B2?F0EDE4mD3B2BFF0EDE4mD3B2BFF0EDE4mD3B2?F0EDE4mD3B2?F0EDE4mD3B2?F0EDE4mD3B2BFF0EDE4mD3B2BFF0EDE4mD3B2?F0EDE4mD3B2BFF0EDE4mD3B2?F0EDE4mD3B2?F0EDE4mD3B2?F0EDE4mD3B2BFF0EDE4mD3B2?F0EDE4mD3B2?F0EDE4mD3B2?F0EDE4mD3B2VERTICES 8 16
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0POINT_DATA 8
SCALARS mass double
LOOKUP_TABLE default
@H 0 0 0 0 0 0@H 0 0 0 0 0 0@H 0 0 0 0 0 0@H 0 0 0 0 0 0@H 0 0 0 0 0 0@H 0 0 0 0 0 0@H 0 0 0 0 0 0@H 0 0 0 0 0 0VECTORS 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;
}
相关文章:
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 如何忽略某些二进制文件的执行?
- 对在不同二进制文件中创建的对象文件的依赖关系
- 使用vtkGenericDataObjectReader读取.vtk二进制文件