2015-02-04 7 views
1

Я пытаюсь проанализировать файл VTK на C, извлекая его данные точек и сохраняя каждую точку в трехмерном массиве. Тем не менее, файл, с которым я работаю, имеет 9 шорт за точку, и мне трудно понять, что означает каждый номер.Файл VTK Structured Point

Я считаю, что я понимаю, большая часть информации заголовка (пожалуйста, поправьте меня, если я неправильно понял):

  • ASCII: Тип файла (ASCII или Binary)
  • DATASET: Тип набора данных
  • Размеры: тускнеет воксели (х, у, г)
  • РАССТОЯНИЕ: Объем каждого воксела (ш, ч, д)
  • ПРОИСХОЖДЕНИЯ: Неуверенного
  • точка данных: Общее кол ber of 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 
... 

спасибо.

+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 поля могут быть отображены, чтобы понять расположение данных: изменение х быстрее, чем у, которые изменяются быстрее, чем г в файле.

Если вы хотите сохранить данные в массиве 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 работает отлично. Его можно заменить на "%s",&headerpart[0]. Функция strcmp() сравнивает две строки и возвращает 0, если строки идентичны.

Как ваша сетка кажется большим, файлы меньшего размера могут быть получены с использованием BINARY рода вместо ASCII, но следить за endianess, как указано here.

+0

Спасибо за ответ, очень полезен метод fscanf (он использовал strtok_r для разбивки каждой строки!).Как я могу использовать fscanf для эффективного разделения заголовка (например, для использования в шкале dims в структуре). Также (я новичок в вокселях), так как точки связаны с координатой? можете ли вы привести пример, который я мог бы визуализировать? –