IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

[SDL2_TTF] Superposer du texte sur un graphique


Sujet :

SDL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 21
    Points : 14
    Points
    14
    Par défaut [SDL2_TTF] Superposer du texte sur un graphique
    Bonjour à tous,

    Je cherche à superposer du texte sur un graphique pour faire une légende.

    Voici le graphique obtenu sans texte :
    Nom : 84069835OK.png
Affichages : 525
Taille : 14,0 Ko

    Et voici ce que j'obtiens quand j'essaie de rajouter le texte par dessus :
    Nom : 853046PasOK.png
Affichages : 429
Taille : 12,9 Ko

    Autrement dit le fond blanc de la surface du texte recouvre toute la surface de l'écran au lieu de se superposer.

    Voici le code en question :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    //
    //  main.c
    //  test3
    //
    //  Created by Benoit Castagnetto on 09/02/2016.
    //  Copyright © 2016 Benoit Castagnetto. All rights reserved.
    //
     
    // Inclusion des bibliothèques
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL2_ttf/SDL_ttf.h>
    #include <SDL2_image/SDL_image.h>
    #include <math.h>
    #include <SDL2/SDL.h>
    //bibliothèque créée pour contenir les fonctions utiles
    #include "fonctions.h"
     
    // on ouvre le main
    int main (int argc, char** argv)
    {
        // Création des tableaux de valeur pour x et y
        double tableauAbscisses[10] = {0};
        double tableauOrdonnees[10] = {0};
        double tableauDerivees[10] = {0};
     
        // initialisation des valeurs. Dans la version finale elles seront données par l'utilisateur.
        double Ca = 0.1, Cb=0.1, Va=5, taille = 10, pas = 1;
     
        // on crée les abscisses et les ordonnées
        remplirAbscisses(tableauAbscisses, taille, pas);
        remplirOrdonnees(tableauAbscisses, tableauOrdonnees, Ca, Cb, Va, taille);
     
        /* Création des variables utiles pour le graphique
         largeur et hauteur sont la taille de la fenêtre
         echelleX va de 0 à 11 pour le moment et le test, à fixer par l'utilisateur ou à 25 mL ?
         echelleY va de 0 à 15 vu que c'est du pH
         pixelX-Y sont les mises à l'échelle de la fenêtre des abscisses et ordonnées
         posX-Y sont les positions de la fenêtre à l'écran
         origine est la position de l'origine des axes
         */
        int largeur = 640;
        int hauteur = 480;
        double echelleXMin = 0;
        double echelleXMax = 11;
        double echelleYMin = 0;
        double echelleYMax = 15;
        int pixelX = 0, pixelY = 0, pixelDerY = 0, posX = 100, posY = 100, origine = 30;
     
        remplirDerivees(tableauDerivees, tableauAbscisses, tableauOrdonnees, taille);
     
        // initialisation de la vidéo
        SDL_Init(SDL_INIT_VIDEO);
     
     
        // création d'une fenêtre
        SDL_Window* window = NULL;
        window = SDL_CreateWindow("Dosage", posX, posY, largeur, hauteur, SDL_WINDOW_SHOWN);
     
     
    // A PARTIR D'ICI ON AFFICHE LE TEXTE
     
        TTF_Init();
        // Création du pointeur de type SDL_Surface nécessaire pour afficher le texte
       SDL_Surface *pSurf = SDL_GetWindowSurface(window);
     
    // tentative de créer une autre surface mais échec
    //   SDL_Surface* pSurf = SDL_CreateRGBSurface (0, 100, 100, 32, 0, 0, 0, 0);
     
     
        // Création du pointeur qui va contenir le texte de légende du graphique
        SDL_Surface *texte = NULL;
     
        // Création du pointeur qui va contenir les coordonnées du texte
        SDL_Rect texteposition;
     
        // On crée le pointeur pour la police de texte
        TTF_Font *police = NULL;
     
        // Chargement de la police, chemin absolu nécessaire sinon ça renvoie un NULL
        if((police = TTF_OpenFont("/Library/Fonts/Arial.ttf", 12)) == NULL)
            fprintf(stderr, "Erreur pour charger la police\n");
     
        //On crée les couleurs de police
        SDL_Color couleurNoire = {0, 0, 0};
     
        // Écriture du texte dans la SDL_Surface texte en mode Blended
        texte = TTF_RenderText_Blended(police, "pH", couleurNoire);
        if(texte == NULL)
        {
            printf("Erreur lors de l'écriture du texte\n");
        }
     
        // On place le texte à l'écran
        SDL_FillRect(pSurf, NULL, SDL_MapRGB(pSurf->format, 255, 255, 255));
        texteposition.x = 2;
        texteposition.y = 2;
        SDL_BlitSurface(texte, NULL, pSurf, &texteposition);
        SDL_UpdateWindowSurface(window);
     
        // On quitte
        SDL_FreeSurface(texte);
        TTF_CloseFont(police);
        TTF_Quit();
     
     
        // création d'un renderer de fond blanc
        SDL_Renderer* renderer = NULL;
        renderer =SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED);
        SDL_SetRenderDrawColor( renderer, 255, 255, 255, 255 );
     
        // Remplissage du fond en blanc
        SDL_RenderClear(renderer);
     
     
        /* Petit calcul de proportionnalité pour la mise à l'échelle
         Pour Y, attention car la numérotation commence en haut à gauche de la fenêtre et non en bas à gauche
         */
        for(int i=0; i<taille; i++)
        {
            /* ci-dessous le -0.5 se décompose en fait en -1 + 0.5
             Comme le point fait 3x3, ajouter -1 permet de mettre le centre du point sur la valeur voulue et non le coin du point
             Comme les nombres sont ici tous positifs et qu'on passe de double à int le +0,5 assure un arrondi correct (car cela se fait systématiquement par défaut)
             */
            pixelX = -0.5 + origine + (tableauAbscisses[i] - echelleXMin) / (echelleXMax - echelleXMin) * largeur;
            pixelY = -0.5 - origine + hauteur - ((tableauOrdonnees[i] - echelleYMin) / (echelleYMax - echelleYMin) * hauteur);
     
            pixelDerY = -0.5 - origine + hauteur - ((tableauDerivees[i] - echelleYMin) / (echelleYMax - echelleYMin) * hauteur);
     
            /* à décommenter en cas de doute pour vérifier que le calcul des pixelX-Y se passe bien
             printf("%d\n",pixelX);
             printf("%d\n",pixelY);
             */
     
            //Creation d'un point de 3par3 pour marquer les coordonnées
            SDL_Rect point;
            point.x = pixelX;
            point.y = pixelY;
            point.w = 3;
            point.h = 3;
     
            SDL_Rect Derpoint;
            Derpoint.x = pixelX;
            Derpoint.y = pixelDerY;
            Derpoint.w = 3;
            Derpoint.h = 3;
     
            // On passe en noir pour le point pH=f(V)
            SDL_SetRenderDrawColor( renderer, 0, 0, 0, 255 );
            SDL_RenderFillRect( renderer, &point );
     
            // On passe en noir pour le point dpH/dV=f(V)
            SDL_SetRenderDrawColor( renderer, 0, 255, 0, 255 );
            SDL_RenderFillRect( renderer, &Derpoint );
        }
     
        // tracé des axes
        // Rouge pour les abscisses V
        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255 );
        SDL_RenderDrawLine(renderer, 0, hauteur - origine, largeur, hauteur - origine );
        // Bleu pour le pH
        SDL_SetRenderDrawColor( renderer, 0, 0, 255, 255 );
        SDL_RenderDrawLine(renderer, origine, 0, origine, hauteur );
        // Vert pour la dérivée dpH/dV, affiché à droite pour ne pas se superposer avec l'autre axe
        SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255 );
        SDL_RenderDrawLine(renderer, largeur - origine, 0, largeur - origine, hauteur );
     
     
        // Mise à jour de l'écran avec le rectangle
        SDL_RenderPresent(renderer);
     
        // on bloque la fenêtre à l'aide d'un event
        while (1) {
            SDL_Event e;
            if (SDL_PollEvent(&e)) {
                if (e.type == SDL_QUIT) {
                    break;
                }
            }
        }
     
        // On détruit tout proprement
     
        SDL_DestroyRenderer(renderer);
        SDL_DestroyWindow(window);
        SDL_Quit();
     
        return 0;
    }
    J'ai essayé de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface *pSurf = SDL_GetWindowSurface(window);
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface* pSurf = SDL_CreateRGBSurface (0, 100, 100, 32, 0, 0, 0, 0);
    pour créer une surface d'affichage qui ne ferait pas la taille de la fenêtre entière mais dans ce cas j'obtiens uniquement le graphique et pas le texte.

    J'ai aussi essayé de rendre la surface blanche du texte transparente mais sans succès.

    Quelqu'un a-t-il une idée de comment je pourrais résoudre le problème SVP ?

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Plusieurs soucis qui font que l'une ou l'autre de tes surfaces n'est pas visible :
    • les derniers arguments de SDL_CreateRGBSurface sont des masques, s'ils sont tous à zéro ça ne va pas fonctionner ;
    • ligne 85 : SDL_Color couleurNoire = {0, 0, 0}; tu n'initialises pas la composante alpha ;
    • d'après la documentation de SDL_MapRGB : Use this function to map an RGB triple to an opaque pixel value, SDL_MapRGBA est sans doute plus adaptée ici.


    Assures-toi d'avoir bien lu et compris la page de documentation qui la concerne lorsque tu utilises une nouvelle fonction, tout y est en général.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Plusieurs soucis qui font que l'une ou l'autre de tes surfaces n'est pas visible :[*]les derniers arguments de SDL_CreateRGBSurface sont des masques, s'ils sont tous à zéro ça ne va pas fonctionner ;
    D'après la page https://wiki.libsdl.org/SDL_CreateRGBSurface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        /* or using the default masks for the depth: */
        surface = SDL_CreateRGBSurface(0,width,height,32,0,0,0,0);
    Du coup je pensais que ça pouvait fonctionner. J'ai tenté avec des valeurs de masque 0xff000000 etc. mais sans succès


    Citation Envoyé par Matt_Houston Voir le message
    [*]ligne 85 : SDL_Color couleurNoire = {0, 0, 0}; tu n'initialises pas la composante alpha ;[*]d'après la documentation de SDL_MapRGB : Use this function to map an RGB triple to an opaque pixel value, SDL_MapRGBA est sans doute plus adaptée ici.
    Que la couleur du texte soit opaque est ce que je souhaite. Je voudrais plaquer du texte opaque sur un graphique. Ou alors je fais une erreur de raisonnement ?

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par asanque Voir le message
    D'après la page https://wiki.libsdl.org/SDL_CreateRGBSurface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        /* or using the default masks for the depth: */
        surface = SDL_CreateRGBSurface(0,width,height,32,0,0,0,0);
    Du coup je pensais que ça pouvait fonctionner. J'ai tenté avec des valeurs de masque 0xff000000 etc. mais sans succès
    Exact ! J'étais bien à côté de la plaque lorsque j'ai écrit cela. Tu vois je n'ai même pas appliqué mes propres conseils (lire la doc avec attention)...


    Citation Envoyé par asanque Voir le message
    Que la couleur du texte soit opaque est ce que je souhaite. Je voudrais plaquer du texte opaque sur un graphique. Ou alors je fais une erreur de raisonnement ?
    Oui mais quand tu fais SDL_FillRect(pSurf, NULL, SDL_MapRGB(pSurf->format, 255, 255, 255));, tu remplis toute la surface avec du blanc opaque alors que tu veux plutôt un alpha à zéro justement. Quant au fait que tu ne voies pas ton texte, c'est dû au fait que tu n'initialises pas la valeur alpha de la couleur de dessin. Sa valeur ici se trouve probablement être zéro : invisible.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    J'ai modifié la ligne en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        SDL_FillRect(pSurf, NULL, SDL_MapRGBA(pSurf->format, 255, 255, 255,0));
    Mais ça ne change rien, j'ai toujours le graphique sans le texte par dessus T.T

  6. #6
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Quant au fait que tu ne voies pas ton texte, c'est dû au fait que tu n'initialises pas la valeur alpha de la couleur de dessin. Sa valeur ici se trouve probablement être zéro : invisible.
    Je fais référence ici à la ligne 85 mentionnée plus haut.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Bon j'ai tout repris à la base en essayant de simplifier.
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    //
    //* main.c
    //* test4
    //
    //* Created by Benoit Castagnetto on 10/02/2016.
    //* Copyright © 2016 Benoit Castagnetto. All rights reserved.
    //
     
    // Inclusion des bibliothèques
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL2_image/SDL_image.h>
    #include <SDL2/SDL.h>
    #include <SDL2_ttf/SDL_ttf.h>
    //bibliothèque créée pour contenir les fonctions utiles
    #include "fonctions.h"
     
    // on ouvre le main
    int main (int argc, char** argv)
    {
        // Création des tableaux de valeur pour x et y
            double tableauAbscisses[10] = {0}, tableauOrdonnees[10] = {0}, tableauDerivees[10] = {0};
     
        // initialisation des valeurs. Dans la version finale elles seront données par l'utilisateur.
            double Ca = 0.1, Cb=0.11, Va=5, taille = 10, pas = 1, Ve = 0, pHe = 0;
     
        // on crée les abscisses et les ordonnées à l'aide des fonctions créées
            remplirAbscisses(tableauAbscisses, taille, pas);
            remplirOrdonnees(tableauAbscisses, tableauOrdonnees, Ca, Cb, Va, taille);
            remplirDerivees(tableauDerivees, tableauAbscisses, tableauOrdonnees, taille);
     
        // on détermine et on affiche la valeur du volume et du pH équivalent à l'aide des fonctions créées
            Ve = determinationVe(tableauDerivees, tableauAbscisses, taille);
            printf("Le volume équivalent est de %lf mL\n",Ve);
            pHe = determinationpHe(tableauDerivees, tableauOrdonnees, taille);
            printf("Le pH à l'équivalence est de %lf\n",pHe);
     
         /* Création des variables utiles pour le grapHique
         largeur et hauteur sont la taille de la fenêtre
         echelleX va de 0 à 11 pour le moment et le test, à fixer par l'utilisateur ou à 25 mL ?
         echelleY va de 0 à 15 vu que c'est du pH
         pixelX-Y sont les mises à l'échelle de la fenêtre des abscisses et ordonnées
         posX-Y sont les positions de la fenêtre à l'écran
         origine est la position de l'origine des axes
         */
            int largeur = 640, hauteur = 480, pixelX = 0, pixelY = 0, pixelDerY = 0, pixelVe = 0, pixelpHe = 0, posX = 400, posY = 100, origine = 30;
            double echelleXMin = 0, echelleXMax = 11, echelleYMin = 0, echelleYMax = 15;
     
        // On initialise la SDL et TTF
            SDL_Init(SDL_INIT_VIDEO);
            TTF_Init();
     
        // Création d'un pointeur window pour la fenêtre du graphique
            SDL_Window *window = NULL;
            window = SDL_CreateWindow("Dosage", posX, posY, largeur, hauteur, SDL_WINDOW_SHOWN);
     
        //Création d'un pointeur renderer pour le graphique
            SDL_Renderer *renderer = NULL;
            renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED);
     
        // Création de pointeurs pour les surfaces qui vont contenir les annotations
            SDL_Surface *textepH = NULL, *texteV = NULL, *textedpHSurdV = NULL, *textepHe = NULL, *texteVe = NULL;
     
        // Création d'un pointeur pour la police, on utilise Times New Roman, lisible et passe partout
            TTF_Font *police = NULL;
            police = TTF_OpenFont("/Library/Fonts/Times New Roman.ttf", 12);
     
        // On crée les couleurs utiles pour les polices, bleue pour le pH, noire pour V et rouge pour la dpH/dV
            SDL_Color couleurNoire = {0, 0, 0};
            SDL_Color couleurBleue = {0, 0, 255};
            SDL_Color couleurVerte = {0, 255, 0};
            SDL_Color couleurRouge = {255, 0, 0};
     
        // On affecte les annotations au pointeur correspondant
            textepH = TTF_RenderText_Blended(police, "pH", couleurBleue);
            texteV = TTF_RenderText_Blended(police, "V (en mL)", couleurNoire);
            textedpHSurdV = TTF_RenderText_Blended(police, "dpH / dV", couleurRouge);
     
        // On prépare l'affichage de la valeur de pHe et Ve sur le graph
            // On convertit la valeur de pHe en chaîne de caractère et on garde un chiffre derrière la virgule
            char convpHe[1];
            sprintf(convpHe, "%.1lf", pHe);
            // On crée une chaîne de caractère qui va afficher "pHe = valeur_avec_un_chiffre_derrière_la_virgule" à l'écran
            char affichepHe[7];
            strcpy(affichepHe, "pHe = ");
            strncat( affichepHe, convpHe, 4 );
            // On affiche à l'écran la valeur de pHe
            textepHe = TTF_RenderText_Blended(police, affichepHe, couleurVerte);
     
            // On convertit la valeur de Ve en chaîne de caractère et on garde un chiffre derrière la virgule
            char convVe[1];
            sprintf(convVe, "%.1lf", Ve);
            // On crée une chaîne de caractère qui va afficher "Ve = valeur_avec_un_chiffre_derrière_la_virgule" à l'écran
            char afficheVe[7];
            strcpy(afficheVe, "Ve = ");
            printf("%s\n", strncat( afficheVe, convVe, 6 ));
            // Et on recommence pour ajouter mL : "Ve = valeur_avec_un_chiffre_derrière_la_virgule mL"
            char afficheVeFin[4];
            strcpy(afficheVeFin, " mL");
            printf("%s\n", strncat( afficheVe, afficheVeFin, 3 ));
            // On affiche à l'écran la valeur de Ve
            texteVe = TTF_RenderText_Blended(police, afficheVe, couleurVerte);
     
        // Instructions à garder sous le coude pour la transparence au cas où
            // SDL_SetColorKey(textepH, SDL_TRUE, SDL_MapRGB(textepH->format, 0, 0, 0));
     
        // On crée une texture à partir de textepH
            SDL_Texture *texturepH = SDL_CreateTextureFromSurface(renderer, textepH);
            SDL_Texture *textureV = SDL_CreateTextureFromSurface(renderer, texteV);
            SDL_Texture *texturepHe = SDL_CreateTextureFromSurface(renderer, textepHe);
            SDL_Texture *textureVe = SDL_CreateTextureFromSurface(renderer, texteVe);
            SDL_Texture *texturedpHSurdV = SDL_CreateTextureFromSurface(renderer, textedpHSurdV);
     
        // On passe en couleur blanche
            SDL_SetRenderDrawColor( renderer, 255, 255, 255, 255 );
     
        // Et on passe le renderer avec cette couleur
            SDL_RenderClear(renderer);
     
        /* On va maintenant calculer les coordonnées des points à placer sur le grapH
           Pour se faire on fait un calcul de proportionnalité
           Pour Y, attention car la numérotation commence en haut à gauche de la fenêtre et non en bas à gauche
           le -0.5 dans la formule se décompose en fait en -1 + 0.5
           Comme le point fait 3x3, ajouter -1 permet de mettre le centre du point sur la valeur voulue et non le coin du point
           Comme les nombres sont ici tous positifs et qu'on passe de double à int le +0,5 assure un arrondi correct (car cela se fait systématiquement par défaut)
         */
     
            for(int i=0; i<taille; i++)
                {
                    pixelX = -0.5 + origine + (tableauAbscisses[i] - echelleXMin) / (echelleXMax - echelleXMin) * largeur;
                    pixelY = -0.5 - origine + hauteur - ((tableauOrdonnees[i] - echelleYMin) / (echelleYMax - echelleYMin) * hauteur);
                    pixelDerY = -0.5 - origine + hauteur - ((tableauDerivees[i] - echelleYMin) / (echelleYMax - echelleYMin) * hauteur);
     
                    // à décommenter en cas de doute pour vérifier que le calcul des pixelX-Y se passe bien
                    // printf("%d\n",pixelX);
                    // printf("%d\n",pixelY);
                    // printf("%d\n",pixelDerY);
     
                    //Creation d'un rectangle de 3par3 pour faire le point de coordonnées (pixelX,pixelY) et (pixelX,pixelDerY) sur le grapH
                    SDL_Rect point = {pixelX, pixelY, 3, 3};
                    SDL_Rect Derpoint =  {pixelX, pixelDerY, 3, 3};;
     
                    // On affiche le point de coordonnées(V,pH) en rouge
                    SDL_SetRenderDrawColor( renderer, 0, 0, 255, 255 );
                    SDL_RenderFillRect( renderer, &point );
     
                    // On affiche le point de coordonnées(V,dpH/dV) en vert
                    SDL_SetRenderDrawColor( renderer, 255, 0, 0, 255 );
                    SDL_RenderFillRect( renderer, &Derpoint );
                }
     
            // On crée ici les coordonnées de Ve et pHe à l'échelle du graph. le +0,5 sert à arrondir correctement lors de la conversion de double vers int
                pixelVe = 0.5 + origine + (Ve - echelleXMin) / (echelleXMax - echelleXMin) * largeur;
                pixelpHe = 0.5 - origine + hauteur - ((pHe - echelleYMin) / (echelleYMax - echelleYMin) * hauteur);
     
     
            // tracé des axes, on utilise une couleur différente pour chacun
            // Noir pour les abscisses V
                SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255 );
                SDL_RenderDrawLine(renderer, 0, hauteur - origine, largeur, hauteur - origine );
     
            // Bleu pour le pH
                SDL_SetRenderDrawColor( renderer, 0, 0, 255, 255 );
                SDL_RenderDrawLine(renderer, origine, 0, origine, hauteur );
     
            // Rouge pour la dérivée dpH/dV, affiché à droite pour ne pas se superposer avec l'autre axe
                SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255 );
                SDL_RenderDrawLine(renderer, largeur - origine, 0, largeur - origine, hauteur );
     
            // Vert et en pointillé pour le point équivalent.
                SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255 );
                for( int i = 0; i < hauteur; i = i + 4 )
                    {
                        SDL_RenderDrawPoint(renderer, pixelVe, i );
                    };
                for( int i = 0; i < largeur; i = i + 4 )
                    {
                        SDL_RenderDrawPoint(renderer, i, pixelpHe );
                    };
     
            // On place le texte à 10 pixel de la droite  et 2 du haut avec une largeur de 15 et une hauteur de 15 et aini de suite
                SDL_Rect textepH_position = {10, 2, 15, 15};
                SDL_Rect texteV_position = {largeur - 85, hauteur - 29, 50, 15};
                SDL_Rect textepHe_position = {origine + 5, pixelpHe - 15, 50, 15};
                SDL_Rect texteVe_position = {pixelVe, hauteur - 29, 60, 15};
                SDL_Rect textedpHSurdV_position = {largeur - 85, 2, 45, 15};
     
            // On copie la texture vers le renderer
                SDL_RenderCopy(renderer, texturepH, NULL, &textepH_position);
                SDL_RenderCopy(renderer, textureV, NULL, &texteV_position);
                SDL_RenderCopy(renderer, texturepHe, NULL, &textepHe_position);
                SDL_RenderCopy(renderer, textureVe, NULL, &texteVe_position);
                SDL_RenderCopy(renderer, texturedpHSurdV, NULL, &textedpHSurdV_position);
     
            // On met à jour l'affichage
                SDL_RenderPresent(renderer);
     
            // On bloque la fenêtre à l'aide d'un event
                while (1) {
                    SDL_Event e;
                    if (SDL_PollEvent(&e)) {
                        if (e.type == SDL_QUIT) {
                            break;
                        }
                    }
                }
     
        // On ferme tout proprement
        SDL_FreeSurface(textepH);
        SDL_FreeSurface(texteV);
        SDL_FreeSurface(textepHe);
        SDL_FreeSurface(texteVe);
        SDL_FreeSurface(textedpHSurdV);
        TTF_CloseFont(police);
        TTF_Quit();
     
        SDL_DestroyRenderer(renderer);
        SDL_DestroyWindow(window);
        SDL_Quit();
     
        return 0;
    }
    Ça donne quelque chose de propre je trouve ^^
    Nom : 0d200073db2b8af12bac60657dcf7252.png
Affichages : 485
Taille : 12,0 Ko

  8. #8
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par asanque Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // On crée les couleurs utiles pour les polices, bleue pour le pH, noire pour V et rouge pour la dpH/dV
            SDL_Color couleurNoire = {0, 0, 0};
            SDL_Color couleurBleue = {0, 0, 255};
            SDL_Color couleurVerte = {0, 255, 0};
            SDL_Color couleurRouge = {255, 0, 0};
    Tu n'initialises toujours pas correctement tes couleurs.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter du texte sur des graphiques pdf
    Par Fort en pommes dans le forum R
    Réponses: 1
    Dernier message: 20/08/2014, 09h44
  2. [XL-2010] Superposer une courbe sur un graphique en chandelier
    Par Julian_hdp dans le forum Excel
    Réponses: 1
    Dernier message: 02/12/2012, 16h13
  3. Réponses: 1
    Dernier message: 01/08/2007, 00h17
  4. Réponses: 3
    Dernier message: 09/05/2007, 12h11
  5. [HTML] HTML: Superposer du texte sur une image
    Par claralavraie dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 09/02/2006, 13h44

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