p
u
b
l
i
c
i
t
é
publicité

Discussion: Format VTK (binaire)

  1. #1
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : mars 2003
    Messages : 192
    Points : 68
    Points
    68

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

  2. #2
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : mars 2003
    Messages : 192
    Points : 68
    Points
    68

    Par défaut

    Citation Envoyé par Heimdall Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. Compréhension du format VTk et VTU
    Par luffy64 dans le forum C++
    Réponses: 0
    Dernier message: 18/03/2010, 14h20
  2. Format Intel HEX en binaire
    Par Shikamaru86 dans le forum C
    Réponses: 4
    Dernier message: 13/04/2007, 18h24
  3. Ecriture fichier binaire : Format TIFF
    Par xChRiSx dans le forum C++
    Réponses: 2
    Dernier message: 12/04/2007, 18h39
  4. Format hexadécimal ou binaire
    Par tun07 dans le forum C
    Réponses: 11
    Dernier message: 29/03/2007, 09h42
  5. afficher un nombre sous format binaire?
    Par sofiane44 dans le forum C++
    Réponses: 2
    Dernier message: 20/01/2006, 18h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo