c - VTK 结构化点文件

标签 c vtk voxel paraview

我试图通过提取点数据并将每个点存储在 3D 数组中来解析 C 中的 VTK 文件。但是,我正在使用的文件每个点有 9 个短裤,我很难理解每个数字的含义。

我相信我理解了大部分的标题信息(如果我理解有误,请指正):

  • ASCII:文件类型(ASCII 或二进制)
  • DATASET:数据集类型
  • DIMENSIONS:dims of voxels (x,y,z)
  • SPACING:每个体素的体积 (w,h,d)
  • 来源:不确定
  • 点数据:点/体素总数 (dimx.dimy.dimz)

我查看了文档,但仍然不了解如何解释数据。有人可以帮助我理解或指出一些有用的资源吗

# vtk DataFile Version 3.0
vtk output
ASCII
DATASET STRUCTURED_POINTS
DIMENSIONS 256 256 130
SPACING 1 1 1.3
ORIGIN 86.6449 -133.929 116.786
POINT_DATA 8519680
SCALARS scalars short
LOOKUP_TABLE default
0 0 0 0 0 0 0 0 0 
0 0 7 2 4 5 3 3 4 
4 5 5 1 7 7 1 1 2 
1 6 4 3 3 1 0 4 2 
2 3 2 4 2 2 0 2 6 
...

谢谢。

最佳答案

关于 header 中字段的含义,您是正确的。 ORIGIN 对应于网格 0-0-0 角的坐标。 DATASET STRUCTURED_POINTS 的示例可以在 documentation 中找到.

从这里开始,这是一个小文件,每个点有 6 个短裤。每条线代表一个点。

# vtk DataFile Version 2.0
Volume example
ASCII
DATASET STRUCTURED_POINTS
DIMENSIONS 3 4 2
ASPECT_RATIO 1 1 1
ORIGIN 0 0 0
POINT_DATA 24
SCALARS volume_scalars char 6
LOOKUP_TABLE default
0 1 2 3 4 5
1 1 2 3 4 5
2 1 2 3 4 5
0 2 2 3 4 5
1 2 2 3 4 5
2 2 2 3 4 5
0 3 2 8 9 10
1 3 2 8 9 10
2 3 2 8 9 10
0 4 2 8 9 10
1 4 2 8 9 10
2 4 2 8 9 10
0 1 3 18 19 20
1 1 3 18 19 20
2 1 3 18 19 20
0 2 3 18 19 20
1 2 3 18 19 20
2 2 3 18 19 20
0 3 3 24 25 26
1 3 3 24 25 26
2 3 3 24 25 26
0 4 3 24 25 26
1 4 3 24 25 26
2 4 3 24 25 26

可以显示前 3 个字段以了解数据布局:x 变化比 y 快,文件中的变化比 z 快。

如果您希望将数据存储在数组 a[2][4][3][6] 中,只需在循环中读取即可:

for(k=0;k<2;k++){ //z loop  
  for(j=0;j<4;j++){ //y loop : y change faster than z
    for(i=0;i<3;i++){ //x loop : x change faster than y 
      for(l=0;l<6;l++){
         fscanf(file,"%d",&a[k][j][i][l]);
      }
    }
  }
}

要阅读标题,fscanf()也可以使用:

int sizex,sizey,sizez;
char headerpart[100];
fscanf(file,"%s",headerpart);
if(strcmp(headerpart,"DIMENSIONS")==0){
   fscanf(file,"%d%d%d",&sizex,&sizey,&sizez);
}

注意 fscanf() 需要指向数据的指针(&sizex,而不是 sizex)。作为指向以 \0"%s",headerpart 结尾的 char 数组的指针的字符串工作正常。可以用"%s",&headerpart[0]代替。函数strcmp()比较两个字符串,如果字符串相同则返回 0

由于您的网格看起来很大,可以使用 BINARY 类型而不是 ASCII 获得较小的文件,但要注意 endianess按照说明here .

关于c - VTK 结构化点文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28323373/

相关文章:

c - 在 C 中回显客户端服务器 - 我有一个开放的服务器,它从不同的客户端获取字符串 - 我如何在新的迭代中替换旧的 char[]

c - 写入文件(fprintf)

c - Haskell 中的高阶函数到底能做什么扩展 C 不能做的事情?

c - 如何将机器代码发送到特定处理器?

Python:获取两个 3D 点之间的所有坐标或绘制 3D 线

c# - 玩家到体素碰撞检测/响应

python - 二值化图像数据

linux - 在 Linux 上构建 VTK 时出现错误 "GLintptr has not been declared"

python - 如何使用 python 将 3D vtk 渲染场景导出到 paraview?

scenekit - 如何将我的体素模型用于我的 SKScene 游戏?