Salut,
Je cherche à enregistrer des données au format VTK (en binaire si possible) afin de les visualiser avec le programme VisIt.
Mes données représentent une trajectoire d'un point en 3D, sur laquelle je souhaite mettre un scalaire, ou un vecteur....
J'ai réussi à le faire avec un fichier au format ASCII, mais je ne parviens pas à faire l'équivalent en Binaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 sprintf(filename, "fichier.vtk"); fp = fopen(filename, "wb"); fprintf(fp, "# vtk DataFile Version 2.0\n"); fprintf(fp, "particle trajectory\n"); /*fichier VTK ASCII */ fprintf(fp, "ASCII\n"); /* données POLYDATA */ fprintf(fp, "DATASET POLYDATA\n"); /*il y a nb_points positions en 3D x y z, z=0*/ fprintf(fp, "POINTS %d float\n", nb_points); for (it = 0; it < nb_points; it++) { fprintf(fp, "%lg %lg 0.0\n", x[it],y[it]); } fprintf(fp,"\n"); /*on créé une cellule de nb_points cotes qui va relier les nb_points*/ fprintf(fp, "LINES 1 %d\n",nb_points+1); /*la premiere (et unique) et unique ligne comporte nb_points*/ fprintf(fp, "%d ", nb_points); /*qui sont ordonnés de 0 a nb_points-1*/ for (it=0; it < nb_points; it++) fprintf(fp, "%d ", it); fprintf(fp,"\n"); /*sur chaque point on mets une donnee*/ fprintf(fp, "POINT_DATA %d\n", nb_points); /*qui est ici un scalaire flottant qui s'appelle 'ypos'*/ fprintf(fp, "SCALARS ypos float\n"); fprintf(fp, "LOOKUP_TABLE default\n"); /*et qui n'est rien d'autre que 'y'*/ for (it=0; it < nb_points; it++) fprintf(fp, "%lg\n", y[it]); fclose(fp);
en binaire, j'ai fait le code ci-dessous, mais malheureusement ça ne marche pas, je ne parviens pas à voir mes données. Avez-vous une idée de ce qui pourrait clocher ? Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 sprintf(filename, "fichier.vtk"); fp = fopen(filename, "wb"); fprintf(fp, "# vtk DataFile Version 2.0\n"); fprintf(fp, "particle trajectory\n"); fprintf(fp, "BINARY\n"); fprintf(fp, "DATASET POLYDATA\n"); fprintf(fp, "POINTS %d float\n", nb_points); for (it = 0; it < nb_points; it++) { write_float(fp, (float)x[it]); write_float(fp, (float)y[it]); } fprintf(fp, "\nLINES 1 %d\n",nb_points + 1); write_int(fp, nb_points); for (it=0; it < nb_points; it++) { write_int(fp, it); } fprintf(fp, "\nPOINT_DATA %d\n", nb_points); fprintf(fp, "SCALARS ypos float\n"); fprintf(fp, "LOOKUP_TABLE default\n"); for (it=0; it < nb_points; it++) write_float(fp, (float)y[it]); fclose(fp);
avec les fonctions suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 void force_big_endian(unsigned char *bytes) { static int doneTest = 0; static int shouldSwap = 0; /* declare an int*/ int tmp1 = 1; /* the char pointer points to the tmp1 variable // so tmp2+1, +2, +3 points to the bytes of tmp1*/ unsigned char *tmp2 = (unsigned char *) &tmp1; /* look if the endianness // of the machine has already been // tested*/ if (!doneTest) { if (*tmp2 != 0) shouldSwap = 1; doneTest = 1; } if (shouldSwap) { unsigned char tmp; tmp = bytes[0]; bytes[0] = bytes[3]; bytes[3] = tmp; tmp = bytes[1]; bytes[1] = bytes[2]; bytes[2] = tmp; } } void write_float(FILE *fp, float val) { force_big_endian((unsigned char *) &val); fwrite(&val, sizeof(float), 1, fp); } void write_int(FILE *fp, int val) { force_big_endian((unsigned char *) &val); fwrite(&val, sizeof(int), 1, fp); }
Partager