2015-02-04 8 views
1

C에서 포인트 데이터를 추출하고 각 포인트를 3D 배열에 저장하여 VTK 파일을 구문 분석하려고합니다. 그러나 내가 작업하고있는 파일에는 포인트 당 9 개의 단락이 있으며 각 번호의 의미를 이해하는 데 어려움을 겪고 있습니다.VTK 구조화 포인트 파일

나는 (내가 잘못 이해 한 경우 나 수정하시기 바랍니다) 내가 헤더 정보의 대부분을 이해 생각 :

  • ASCII : 파일의 형식 (ASCII 또는 바이너리)
  • DATASET : 데이터 세트의 종류
  • DIMENSIONS : 복셀 희미 (X, Y, Z)
  • 간격 :
  • POINT DATA를 확실 : 각 복셀 (w, H, d)
  • ORIGIN 권 총 NUM 포인트/복셀의 점 (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 
... 

감사합니다.

+0

paraview 태그를 추가 했으므로 소프트웨어를 참조로 사용하여 파일이 무엇인지 확인할 수 있습니다 (파일 열기 - 적용 버튼 클릭 - 주 창에서 새로운 "스프레드 시트"보기 열기). 표시되는 스프레드 시트 점 및 그들과 관련된 데이터입니다. – lib

답변

4

헤더의 필드 의미와 관련하여 정확합니다. 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가 파일의 z보다 빠르게 변경되는 y보다 빠르게 변경됩니다. 당신이 배열 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을 사용하여 얻을 수 있지만, here을 지정된 endianess을 감시.

+0

답장을 보내 주셔서 감사합니다. fscanf 메소드도 훌륭합니다 (각 줄을 나누기 위해 strtok_r을 사용했습니다!).헤더를 효율적으로 분할하기 위해 fscanf를 어떻게 사용하면 좋을까요 (예 : 구조체에 dim을 저장하는 데 사용). 또한 (나는 복셀에 익숙하지 않습니다) 포인트가 좌표와 어떻게 관련이 있습니까? 내가 시각화 할 수있는 예제를 줄 수 있니? –