+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Discussion: Format VTK (binaire)

  1. #1
    Membre du Club
    Inscrit en
    mars 2003
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : mars 2003
    Messages : 191
    Points : 61
    Points
    61

    Par défaut Format VTK (binaire)

    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 :
    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 :
    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 :
    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);
    }
    --
    Heimdall

  2. #2
    Membre du Club
    Inscrit en
    mars 2003
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : mars 2003
    Messages : 191
    Points : 61
    Points
    61

    Par défaut

    Citation Envoyé par Heimdall Voir le message

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                /* blablabla */
     
                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]);
                }
     
     
    /* blablabla...*/


    après le second appel de write_float, j'ai oublié la troisième coordonnée, 0 !
    --
    Heimdall

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •