VTK Structured Point file

I am trying to parse a VTK file in C by extracting its point data and storing each point in a 3D array. However, the file I am working with has 9 shorts per point and I am having difficulty understanding what each number means.

I believe I understand most of the header information (please correct me if I have misunderstood):

I have looked at the documentation and I am still not getting an understanding on how to interpret the data. Could someone please help me understand or point me to some helpful resources

# 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 
...

thanks.

Upvotes: 1

Views: 5012

Answers (1)

francis
francis

Reputation: 9817

You are correct regarding the meaning of fields in the header. ORIGIN corresponds to the coordinates of the 0-0-0 corner of the grid. An example of a DATASET STRUCTURED_POINTS can be found in the documentation.

Starting from this, here is a small file with 6 shorts per point. Each line represents a point.

# 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

The 3 first fields may be displayed to understand the data layout : x change faster than y, which change faster than z in file.

If you wish to store the data in an array a[2][4][3][6], just read while doing a loop :

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

To read the header, fscanf() may be used as well :

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

Note than fscanf() need the pointer to the data (&sizex, not sizex). A string being a pointer to an array of char terminated by \0, "%s",headerpart works fine. It can be replaced by "%s",&headerpart[0]. The function strcmp() compares two strings, and return 0 if strings are identical.

As your grid seems large, smaller files can be obtained using the BINARY kind instead of ASCII, but watch for endianess as specified here.

Upvotes: 4

Related Questions