VTK 结构化点文件
VTK Structured Point file
我试图通过提取点数据并将每个点存储在 3D 数组中来解析 C 中的 VTK 文件。但是,我正在使用的文件每个点有 9 个短裤,我很难理解每个数字的含义。
我相信大部分的header信息我都看懂了(如果理解有误请指正):
- ASCII:文件类型(ASCII 或二进制)
- DATASET:数据集类型
- DIMENSIONS:体素的维度 (x,y,z)
- SPACING:每个体素的体积 (w,h,d)
- 来源:不确定
- 点数据:points/voxels (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]);
}
}
}
}
要阅读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。
我试图通过提取点数据并将每个点存储在 3D 数组中来解析 C 中的 VTK 文件。但是,我正在使用的文件每个点有 9 个短裤,我很难理解每个数字的含义。
我相信大部分的header信息我都看懂了(如果理解有误请指正):
- ASCII:文件类型(ASCII 或二进制)
- DATASET:数据集类型
- DIMENSIONS:体素的维度 (x,y,z)
- SPACING:每个体素的体积 (w,h,d)
- 来源:不确定
- 点数据:points/voxels (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]);
}
}
}
}
要阅读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。