VTK 结构化点文件

VTK Structured Point file

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

我相信大部分的header信息我都看懂了(如果理解有误请指正):

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

# 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]);
      }
    }
  }
}

要阅读header,也可以使用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)。作为指向以 [=20=]"%s",headerpart 终止的 char 数组的指针的字符串工作正常。可以用"%s",&headerpart[0]代替。函数 strcmp() 比较两个字符串,如果字符串相同,则 return 0

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