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 :

Graphique avec couleur évolutive


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Graphique avec couleur évolutive
    Bonjour à tous,

    Je suis sous Delphi 4 standard.

    En mode graphique ai-je la possibilité de tracer une ligne dont la couleur passe progressivement du bleu clair à une extrémité au bleu foncé à l’autre extrémité ?

    Merci à ceux qui pourront m’aider.

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Voici une fonction qui renvoie la couleur interpolée dite "dégradée" entre la couleur de gauche et de droite en fonction de la valeur de l'indice i compris entre 0 et DeltaI :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function  Degrade( i, DeltaI : integer; clGauche,clDroite : tColor) : tColor;
    var       cdep, cfin : integer;
              Rdep, Gdep, Bdep, Rfin, Gfin, Bfin : byte;
              pr, pg, pb : real;
    begin     cdep := clGauche;
              cfin := clDroite;
              Rdep := getRvalue(cdep);  Gdep := getGvalue(cdep);  Bdep := getBvalue(cdep);
              Rfin := getRvalue(cfin);  Gfin := getGvalue(cfin);  Bfin := getBvalue(cfin);
              if DeltaI=0 then DeltaI:=1;
              pr := (Rfin-Rdep)/DeltaI; pg := (Gfin-Gdep)/DeltaI;  pb := (Bfin-Bdep)/DeltaI;
              Result:=rgb(Rdep+round(i*pr), Gdep+round(i*pg), Bdep+round(i*pb));
    end;
    Exemple d'utilisation :

    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
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var       i,DeltaI,clVariable,x,y,xo,yo : integer; bmp : tBitMap;
    begin     bmp := tBitMap.create;
              bmp.width:=256; bmp.height:=256;
              with bmp.canvas do begin
                   xo:=10; yo:=21; moveTo(xo,yo); DeltaI:=100;
                   for i:=1 to DeltaI do begin
                       clvariable:=Degrade( i, DeltaI,clYellow,clNavy); //<- Teinte dégradée entre clYellow et clNavy
                       pen.color:=clVariable; pen.style:=psSolid;
                       lineTo(xo+i,yo+i);
                   end;
             end;
             image1.Picture.bitmap.Assign(bmp);
             bmp.free;
    end;
    A+.

    EDIT : remplacer clYellow par clAqua par exemple.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Une autre approche (ébauche à améliorer) en utilisant la fonction GradientFill sur une région:

    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
    procedure TForm1.DrawGradientLine(const aCanvas :TCanvas; const X1, Y1, X2, Y2 :integer; const aStartColor, aEndColor :TColor; aPenSize :integer = 1);
    var
      GradVert :array[0..1] of TRIVERTEX;
      RgnVerts :array[0..3] of TPoint;
      gRect    :GRADIENT_RECT;
      Rgn      :hRgn;
     
    begin
      if aPenSize > 1 then
      aPenSize := aPenSize div 2;
     
      //Crée le ploygone
      RgnVerts[0].X := X1 -aPenSize;
      RgnVerts[0].Y := Y1 -aPenSize;
      RgnVerts[1].X := X1 +aPenSize;
      RgnVerts[1].Y := Y1 +aPenSize;
      RgnVerts[2].X := X2 +aPenSize;
      RgnVerts[2].Y := Y2 +aPenSize;
      RgnVerts[3].X := X2 -aPenSize;
      RgnVerts[3].Y := y2 -aPenSize;
     
      Rgn := CreatePolygonRgn(RgnVerts, 4, WINDING);
     
      //Limite le dessin au polygone
      SelectClipRgn(aCanvas.Handle, Rgn);
     
      //Dégradé
      GradVert[0].x      := X1 -1;
      GradVert[0].y      := Y1 -1;
      GradVert[0].Red    := GetRValue(aStartColor) *$100;
      GradVert[0].Green  := GetGValue(aStartColor) *$100;
      GradVert[0].Blue   := GetBValue(aStartColor) *$100;
      GradVert[0].Alpha  := $FF00;
     
      GradVert[1].x      := X2 +1;
      GradVert[1].y      := Y2 +1;
      GradVert[1].Red    := GetRValue(aEndColor) *$100;
      GradVert[1].Green  := GetGValue(aEndColor) *$100;
      GradVert[1].Blue   := GetBValue(aEndColor) *$100;
      GradVert[1].Alpha  := $FF00;
     
      gRect.UpperLeft  := 0;
      gRect.LowerRight := 1;
      GradientFill(aCanvas.Handle, @GradVert, 2, @gRect, 1, GRADIENT_FILL_RECT_H);
     
      //Supprime la limite de dessin
      SelectClipRgn(aCanvas.Handle, 0);
    end;
     
    procedure TForm1.FormPaint(Sender: TObject);
    begin
      DrawGradientLine(Canvas, 10, 10, ClientWidth -10, 40, clAqua, clBlue, 5);
    end;

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

Discussions similaires

  1. ACM : graphique avec couleurs différentes
    Par canaris dans le forum SAS STAT
    Réponses: 4
    Dernier message: 17/03/2014, 21h08
  2. Graphique avec marqueurs de différentes couleurs
    Par hector2 dans le forum Scilab
    Réponses: 7
    Dernier message: 06/02/2009, 17h05
  3. Automatiser declaration graphique avec changement couleur
    Par stefsas dans le forum ODS et reporting
    Réponses: 3
    Dernier message: 06/08/2008, 17h09
  4. Graphique avec couleurs dynamiques
    Par jblond dans le forum BIRT
    Réponses: 8
    Dernier message: 27/11/2007, 14h47
  5. Réponses: 10
    Dernier message: 30/11/2006, 17h36

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