vtk数据格式错误

时间:2011-12-05 03:46:36

标签: vtk

我正在尝试使用VTK(绘制彩色等值面)可视化我存储在常规网格上的一些数据。我写了一些代码来转储vtk遗留格式的数据,该格式适用于低分辨率版本的数据。我可以使用ParaView或VTK库提取和查看预期的isosurface。当我在每个维度中将分辨率提高10倍(nx从大约100变为1000,与ny,nz相同)时,paraview和我使用VTK库编写的查看器是不正确的。它们看起来像一组略微离轴的纸张而不是单个“blob”。我从其他测试中得知数据本身是正确的。

我的遗留vtk格式转储代码是否有问题?我不明白查找表的作用,但它似乎适用于低分辨率的情况。

std::ofstream out(filename);

out << "# vtk DataFile Version 3.0" << std::endl;
out << "Signed distance/biharmonic visualizer" << std::endl;
out << "ASCII" << std::endl;
out << "DATASET STRUCTURED_POINTS" << std::endl;
out << "DIMENSIONS " << nx << " " << ny << " " << nz << std::endl;
out << "ORIGIN 0 0 0" << std::endl;
out << "SPACING " << h << " " << h << " " << h << std::endl;
out << "POINT_DATA " << nx*ny*nz << std::endl;
out << "SCALARS signedDistance double" << std::endl;
out << "LOOKUP_TABLE default" << std::endl;
for(size_t i = 0; i < nx; ++i)
  for(size_t j = 0; j < ny; ++j)
    for(size_t k = 0; k < nz; ++k)
      out << tempPhi(i,j,k) << std::endl;
out << "SCALARS biharmonic double" << std::endl;
out << "LOOKUP_TABLE default" << std::endl;
for(size_t i = 0; i < nx; ++i)
  for(size_t j = 0; j < ny; ++j)
    for(size_t k = 0; k < nz; ++k)
      out << biharmonic(i,j,k) << std::endl;
out.close();

1 个答案:

答案 0 :(得分:2)

在您提供的VTK文件中,出现了多次1.79769e+308次。要实际“看到”您的数据,我必须用零替换它们。完成此操作并在VisIt中查看了您的数据文件后,我猜您的点数据编写方法不正确(您的三个嵌套for循环 - 将数据从3D压缩到一维列表)。

我建议您使用VTK编写器和this简单C代码编写一些小型测试数据集,这些代码随VisIt一起提供,用于编写传统的VTK文件。确保用两种方法编写的数据集完全一致(请注意,VisItWriterLib.c写入版本2 VTK文件格式,而使用版本3 - 但这不应该导致问题)。

编辑:正如评论中所讨论的,问题是嵌套for循环的排序,这些循环用于输出点数据并将其从3D展平为1D列表。代码

for(size_t i = 0; i < nx; ++i)
  for(size_t j = 0; j < ny; ++j)
    for(size_t k = 0; k < nz; ++k)
      out << tempPhi(i,j,k) << std::endl;

实际上应该阅读

for(size_t k = 0; k < nz; ++k)
  for(size_t j = 0; j < ny; ++j)
    for(size_t i = 0; i < nx; ++i)
      out << tempPhi(i,j,k) << std::endl;

即。数据应该以主要顺序写入,而不是行主要。这是缺乏VTK文件格式文档的一个点。