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

Langage Delphi Discussion :

Comment créer un graphique (canvas) à partir de données ?


Sujet :

Langage Delphi

  1. #1
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut Comment créer un graphique (canvas) à partir de données ?
    Bonjour,

    Je chercher à faire un graphique comme celui ci


    J'ai réussi à faire le fond avec ca

    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
     with stat.canvas do begin
     
        Brush.Color := $00C2EECE; //Color est en réalité Form1.Color c'est à dire la propriète color de form1 que l'on peut voir
                            // et modifier dans l'inspecteur d'objet
        Pen.Color := $00C2EECE;
        Brush.Style := bsSolid; // ainsi, le rectangle sera rempli.
                              //pour voir les autres possibilités faire F1 sur bsSolid
        Rectangle(0, 0, stat.Width, stat.Height); //permet d'effacer le dessin
        Pen.Color := $00A8E3B3;
        for i := 0 to (stat.Width div 50) do begin
          moveto(stat.Width - i * 50, 0);
          lineto(stat.Width - i * 50, stat.Height);
        end;
     
        for i := 0 to (stat.Height div 25) do begin
          moveto(0, stat.Height - i * 25);
          lineto(stat.Width, stat.Height - i * 25);
        end;
        Pen.Color := clblack;
     
        for i := 0 to listbox1.Count - 1 do begin
     
          // ICI LES VALEURS
     
        end;
     
      end;
    Maintenant j'ai une liste d'ordonnés, et j'aimerais à partir de ces valeurs faire une courbe comme ci dessus...
    Comment dessiner des points ? Comment les relier ?
    Comment colorer la partie inférieur de la courbe ?
    Comment faire cet effet de transparence ?

    Merci d'avance pour votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Points : 121
    Points
    121
    Par défaut
    Salut

    Pour tracer une courbe continue, il te faut placer tes points le plus près possible les uns des autres, puis tracer un ligne entre le point courant et le point juste avant...

    Pour ce qui est de l'effet "transparent", il te suffit de tracer ta grille (les lignes verticales et horizontales) après avoir tracé tout le reste

    Pour le remplissage, tu pars d'un point, et tu trace une ligne jusqu'en bas, et ca pour tous les points

    Voila j'espère avoir été clair :)

    @++

  3. #3
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Pour faire des courbes arrondis, il va falloir que tu passes par les courbes de beziers, je n'ai jamais utiliser donc je peux pas t'en dire plus.

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!

    D'abord il faut savoir que Windows ne sait que créer des courbes de Bezier à partir de 3 points, ce qui n'est pas un problème pour nous dans la mesure ou l'on va dessiner 2 courbes, la différence est invisible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Var A: Array[1..4] of TPoint;
    Begin
      A[1].X:=...;  A[1].Y:=....;
      A[2].X:=...;  A[2].Y:=....;
      A[3].X:=...;  A[3].Y:=....;
      A[4].X:=...;  A[4].Y:=....;
      PolyBezier(Canvas.Handle, A, 7);
    End;
    Pourquoi la valeur 7 ? en fait la valeur est issue de l'opération mathématique suivante: 3*nombre de courbe à tracer + 1 = 7. Sachant que si l'on a 3 points on trace 1 courbe, 4 points 2 courbes, 5 --> 3, .... très vite on arrive à n points donne (n-2) courbes.

  5. #5
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    En fait, tout dépend du résultat que tu veux obtenir...
    Si tu désires une courbe attirée par les valeurs avec une précision à définir (4 points),
    ou bien une courbe passant par les valeurs (3 points)...

  6. #6
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    Oki je regarde ca juste une question pour faire une grosse courbe enfin un gros point au lieu d'un petit ?

    Merci beaucoup pour votre aide

  7. #7
    Membre régulier Avatar de yoghisan
    Profil pro
    Inscrit en
    Février 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 172
    Points : 113
    Points
    113
    Par défaut
    Je corrige "Neo82"

    Pour le remplissage, tu pars d'un point, et tu trace une ligne jusqu'en bas, et ca pour tous les points
    Le plus simple pour remplir une couleur au dessus et au dessous de ta courbe, c'est d'utiliser la procedure

    procedure FloodFill(X: Integer, Y: Integer, Color: TColor, FillStyle: TFillStyle);

    type TFillStyle = (fsSurface, fsBorder);
    fsSurface
    La région est définie comme étant toute la zone ayant une couleur spécifiée. Quand une autre couleur est détectée, elle est considérée comme la limite de la région.
    fsBorder
    La région est définie comme étant toute la zone n'ayant pas une couleur spécifiée. Quand la couleur spécifiée est détectée, elle est considérée comme la limite de la région.


    Pour trait plus gros
    Pen.Width := 2; // c'est 1 par défaut

  8. #8
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut ..
    Oki merci

    j'utilise

    Dessine un ensemble de courbes de Bezier.

    Syntaxe Delphi :

    procedure PolyBezier(const Points: array of TPoint);

    Syntaxe C++ :

    void __fastcall PolyBezier(const TPoint* Points, const int Points_Size);

    Description

    PolyBezier permet de dessiner des courbes de Bezier cubiques en utilisant les points finaux et de contrôle spécifiés par le paramètre Points. La première courbe est dessinée à partir du premier point jusqu'au quatrième point, en utilisant le deuxième et le troisième points comme points de contrôle. Chaque courbe ultérieure de la séquence nécessite exactement trois points supplémentaires : le point final de la courbe précédent est utilisé comme point de départ, les deux points suivants de la séquence sont des points de contrôle et le troisième point représente le point final.

    Le paramètre Points fournit les extrémités à utiliser lors de la génération de la courbe de Bezier.

    Le paramètre Points_Size représente l'indice du dernier point du tableau (un de moins que le nombre total de points).

    Cette procédure trace des lignes en utilisant le crayon actif.

    Dans Delphi, vous pouvez utiliser la fonction Slice pour transmettre une portion de tableau de points à la méthode PolyBezier. Par exemple, pour former une courbe de Bézier en utilisant les dix premiers points d'un tableau de 100 points, utilisez la fonction Slice comme suit :

    Canvas.PolyBezier(Slice(PointArray, 10));

    Les points de contrôle après a[Index+3] sont ignorés. Rien ne se passe s'il n'y a pas assez de points de contrôles.
    Ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     var A: array[1..100] of TPoint;
     
        Pen.Color := clblack;
     
        // Construction de la courbe
     
          for i := 0 to 100 do
            A[i].X := i; A[i].Y := 100;
     
          PolyBezier(A);
    Mais je ne vois rien de modifier

  9. #9
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Exemple d'un tracé de courbe passant par les points de données :
    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
    Const
      Liste: Array[1..20] Of Integer = (
        10, 25, 35, 2, 12, 28, 7, 15, 18, 10,
        12, 15, 26, 14, 20, 35, 17, 23, 8, 20);
     
    {----------------------------------------------------------------}
    Procedure TForm1.FormPaint(Sender: TObject);
    Const
      Larg = 2; // Espace entre les points div 3
    Var
      i, A, B, C: Integer;
      P: Array[1..4] Of TPoint;
    Begin
      Canvas.Pen.Width := 2;
      Canvas.Pen.Color := clRed;
      For i := Low(Liste) + 1 To High(Liste) Do
      Begin
        A := Liste[i - 1];
        C := Liste[i];
        B := (A + C) Div 2;
        P[1] := Point((i - 1) * Larg * 3 + Larg * 0, A);
        P[2] := Point((i - 1) * Larg * 3 + Larg * 1, B);
        P[3] := Point((i - 1) * Larg * 3 + Larg * 2, C);
        P[4] := Point((i - 1) * Larg * 3 + Larg * 3, C);
        PolyBezier(Canvas.Handle, P, 4);
      End;
      Canvas.Pen.Color := clBlue;
      Canvas.Pen.Width := 3;
      For i := Low(Liste) To High(Liste) Do
      Begin
        Canvas.Ellipse(
          i * Larg * 3  - 1, Liste[i] - 1,
          i * Larg * 3  + 1, Liste[i] + 1);
      End;
    End;

  10. #10
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    Merci beaucoup ca fonctionne

  11. #11
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Oué mais perso, je ne trouve pas cette méthode terrible.
    J'ai trouvé mieux je crois, mais le code est un peu plus compliqué...
    Je te prépare un exemple si j'ai un peu de temps.

    Je pense qu'il faudra également ajouté un filtre d'anti-aliasing pour adoucir le tout:
    http://sub0.developpez.com/delphi/AAlias.zip

    à+

  12. #12
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    Merci bien pour ton aide mais je galère la a dessiner car ca part dans tout les sens

  13. #13
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    C'est bon ca fonctionne sauf l'antialiasing ...

    J'utilise une TpaintBox pour dessiner donc pas de bitmap ...

    Comment puis je faire pour ne filtrer que la courbe aussi ?

    Merci d'avance Sub0

  14. #14
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Si tu veux filtrer que la courbe, il va falloir utiliser le masque de transparence alpha...
    C'est pas évident à mettre en place je dois t'avouer.
    Avant de continuer à t'expliquer l'anti-aliasing et la transparence, est-ce-que la courbe te convient ?

    ps: Pourquoi ne pas utiliser une TImage plutôt ?

  15. #15
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    En faite ca m'embete de mettre un timage dessiner la courbe
    faire un autre timage pour dessiner le reste ...
    Faire un antialiasing sur l'un ...
    Ca va prendre un temps dingue ?

    Vriament dans mon cas je vois pas comment l'utiliser ...

    merci d'avance

  16. #16
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    Voila sinon pour le progrès maintenant ca donne ca



    Sans aa

  17. #17
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Tu dessiner ta courbe dans un Tbitmap puis tu ajoutes le filtre.
    Tu obtiens une image 32 bits avec un masque alpha.
    Il ne te reste plus qu'à superposer ce bitmap sur le reste de ton image...
    A noter que tu pourrais également utiliser le masque alpha pour réaliser l'effet de transparence...

  18. #18
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    Le timage ne redessine pas correctement au redimensionement !

    Des que je redimenssionne mon graph est coupé ...
    C'est pour ca que je suis passé sur le tpaintbox ...


    Edit : Et pour la superposition .. désolé mais c'est quoi la fonction ?
    Merci

  19. #19
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    En fait, voici comment je procèderais plutôt :

    J'utiliserais la méthode suivante :
    http://iquebec.ifrance.com/eraquila/site/delphi/graphic/bezier1.zip

    Elle est plus compliquée, mais elle est plus efficace et précise selon moi.
    De plus, il est possible d'obtenir tous les points de la courbe et donc de remplir la couleur du bas.
    J'utiliserais des TBitmaps 32bits pour pouvoir utiliser le masque de transparence et l'anti-aliasing.
    Les fonctions sont dispos avec la lib graphics32...

    Bon courage !

  20. #20
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/06/2015, 11h09
  2. Créer un graphique a partir d'une quantité variable de donné.
    Par kent010 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/10/2014, 17h26
  3. Réponses: 3
    Dernier message: 25/07/2005, 09h40
  4. Réponses: 1
    Dernier message: 24/05/2005, 14h50
  5. Comment créer un fichier dummy de taille donnée ?
    Par Maitre Kanter dans le forum Langage
    Réponses: 3
    Dernier message: 13/12/2003, 23h46

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