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

 Delphi Discussion :

Remplir une forme crée avec un polygon


Sujet :

Delphi

  1. #1
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut Remplir une forme crée avec un polygon
    Bonjour,

    J'ai un tableau de 4 points me permettant de définir une forme. La fonction polygon me permet de la dessiner très facilement. Auriez vous une méthode permettant de la remplir avec une couleur uniforme, ou pourquoi pas avec un dégradé du style du dégradé circulaire de photoshop ?

  2. #2
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    Pour la couleur uniforme, j'ai trouvé Mais pour le dégradé, je suppose que ce n'est pas aussi simple...

  3. #3
    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
    Salut,

    Mais pour le dégradé, je suppose que ce n'est pas aussi simple...
    ... effectivement qu'un dégradé circulaire est un peu plus compliqué qu'un dégardé horizontal ou vertical dans le rectangle d'un canvas.

    Suggestion:
    1) Tracer des cercles concentriques de délimation des zones dans lasquelles la couleur est la même,
    2) Calculer les valeurs R,G,B des dégradés en fonction des rayons des cercles et de la couleur de début et de fin du dégradé,
    3) Utilser FloodFill pour remplir les anneaux circulaires avec la nuance de couleur dégradée.

    Pour le caclul des valeurs R,G,B des nuances du dégradé tu peux t'inspirer du code suivant qui n'effectue qu'un dégradé formé de frages horizontales ou verticales :
    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
    Procedure Degrader( CanvasCible : TCanvas; Dim : TRect; CoulDeb,CoulFin : Tcolor; Vertical : boolean);
    //        Param CanvasCible = Canvas cible
    //        Param Dim = Rectangle-Dimensions du canvas-cible
    //        Param CoulDeb,CoulFin = couleurs de début et de fin
    //        Param Vertical : True pour dégradé vertical sinon dégradé horizontal.
    type      TRGB = record R,G,B : integer; end;
    var       Frange : TRect;  // Frange rectangulaire pour tracé couleur courante variable
              i     : Integer; // Compteur pour parcourir la hauteur du canvas
              cDeb  : TRGB;    // valeurs RGB de la couleur de Deb
              cDeg  : TRGB;    // valeurs RGB de la couleur courante
              eD_F  : TRGB;    // écarts de RGB entre couleurs de Deb et de Fin
     
    begin    // valeurs RGB de la couleur de Debut
             cDeb.R := GetRValue(ColorToRGB(CoulDeb));
             cDeb.G := GetGValue(ColorToRGB(CoulDeb));
             cDeb.B := GetBValue(ColorToRGB(CoulDeb));
             // écarts RGB entre couleurs de Deb et de Fin
             eD_F.R := GetRValue(ColorToRGB(CoulFin )) - cDeb.R;
             eD_F.G := GetgValue(ColorToRGB(CoulFin )) - cDeb.G;
             eD_F.B := GetbValue(ColorToRGB(CoulFin )) - cDeb.B;
             // Initialisation des dimensions de la Frange de couleur
             Frange.Left := Dim.Left;
             Frange.Right:= Dim.Right - Dim.Left;
             // Boucle de remplissage en dégradé du canvas
             with CanvasCible do
             begin for i:= 0 to 255 do
                   begin // Dimensions de la Frange
                         if Vertical = true then
                         begin Frange.Left := Dim.Left;
                               Frange.Right:= Dim.Right - Dim.Left;
                               Frange.Top  := MulDiv(i, Dim.Bottom - Dim.top, 256);
                               Frange.Bottom := MulDiv(i+1, Dim.Bottom - Dim.top, 256);
                         end else
                         begin Frange.Top:=Dim.top;
                               Frange.Bottom:= Dim.Bottom - Dim.top;
                               Frange.left  := MulDiv(i, Dim.Right - Dim.Left, 256);
                               Frange.right := MulDiv(i+1 , Dim.Right - Dim.Left, 256);
                         end;
                         // couleur courante dégradée
                         cDeg.R := (cDeb.R + MulDiv(i, eD_F.R, 255)) mod 256;
                         cDeg.G := (cDeb.G + MulDiv(i, eD_F.G, 255)) mod 256;
                         cDeg.B := (cDeb.B + MulDiv(i, eD_F.B, 255)) mod 256;
                         // Tracé sur canvas
                         Brush.color:=RGB(cDeg.R, cDeg.G, cDeg.B);
                         FillRect(Frange);
                   end;
             end;
    end;
     
    // Utilisation :
     
    procedure TfrmTextures.btnDegraderClick(Sender: TObject);
    var       R : TRect;
    begin     with imageTexture do // imageTexture est ici un Timage dans lequel
                // je crée un dégradé sur toute la surface à partir des couleurs de
                // deux Tpanel (plCoulDeb et plCoulFin et d'un RadioButton
                //  (rbVertical) en fonction duquel le dégradé sera horizontal ou
                // vertical.
              begin R:=Rect(0,0,width,height);
                    Degrader( Canvas, R, plCoulDeb.Color, plCoulFin.Color,
                              rbVertical.Checked);
              end;
    end;
    ... reste plus qu'à modifier ce code en remplaçant le concept de 'Frange' par celui des 'anneaux circulaires' : un pb de géométrie et au lieu d'utiliser FillRect(Frange) faudra untiliser FloodFill().

    A+

    EDIT du 04/01/2009 : Au fait pourquoi se casser la tête avec un dégradé circulaire à l'intérieur d'un polygone, ce serait plus simple de créer des dégradés polygonaux à l'intérieur du polygone de base : au lieu d'avoir des zones en forme d'anneaux circulaires qui se fractionnent en plusieurs morceaux à l'approche des pointes du polygone, le remplissage d'anneaux polygonaux homothétiques et concentriques au polygone de base sera bien plus facile à gérer avec FloodFill et l'esthétique sera même meilleure.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

Discussions similaires

  1. [Débutant] Remplir une form avec un autre
    Par Hobbi1 dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/12/2012, 11h19
  2. [XL-2003] Remplir une forme avec un gradient à 3 couleurs
    Par martinmacfly dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/01/2010, 11h47
  3. remplir une forme circulaire avec 2 boucles for
    Par slim_java dans le forum Mathématiques
    Réponses: 3
    Dernier message: 14/07/2009, 17h36
  4. Réponses: 5
    Dernier message: 20/09/2007, 17h53
  5. Réponses: 3
    Dernier message: 23/02/2006, 15h17

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