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 :

tirage aléatoire de couleurs


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    174
    Points
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 174
    Points : 38
    Par défaut tirage aléatoire de couleurs
    Bonjour,

    Je cherche une solution pour générer de manière aléatoire des couleurs.
    Pour le moment j'ai codé un truc rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      MaCouleur := clBlack+Random(clWhite);
    Mais pas forcément satisfaisant.
    En fait, je voudrais que certaines couleurs soient exclues du tirage comme par exemple le blanc, le gris et le noir.

    Si quelqu'un a une suggestion...

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 564
    Points
    3 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 564
    Points : 3 968
    Par défaut
    Salut

    Si le nombre de couleurs n'est pas trop important, places-les dans un tableau et fais un tirage aléatoire sur l'indice du tableau.

    cdlt

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    174
    Points
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 174
    Points : 38
    Par défaut tirage aléatoire de couleurs
    C'est effectivement une solution, mais je ne maitrise pas nécessairement le nombre de couleurs que je devrait générer. Potentiellement une bonne centaine.

  4. #4
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Points
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Par défaut
    tu re-tire tant que ta couleur est interdite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    repeat
      MaCouleur := clBlack+Random(clWhite);
    until not IsCouleurInterdite(MaCouleur);
    avec une fonction du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function IsCouleurInterdite(ACouleur: TColor): Boolean;
    begin
      Result :=  (ACouleur <> clBlack) or
                    (ACouleur <> clWhite) or
                    ... or
                    ( (GetRValue(ACouleur) = GetGValue(ACouleur)) and (GetRValue(ACouleur) = GetBValue(ACouleur)) {gris});
    end;

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    174
    Points
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 174
    Points : 38
    Par défaut on approche du but ;-)
    Effectivement la solution me semble bien.
    Il me reste un petit détail, je voudrais en fait que les couleurs tirées au sort ne soient pas trop sombres car elles me servent comme couleur de fond pour un texte qui lui sera noir. Or noir sur fond marron foncé, c'est difficilement lisible.

  6. #6
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 564
    Points
    3 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 564
    Points : 3 968
    Par défaut
    un peu de bidouille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TColorComp = record
       case boolean of
       False : Valeur : Integer;
       True : Composantes: array[0..4] of byte;
       end;
    end;
    tu affectes la couleur dans Valeur et tu as la décomposition en RGB dans le tableau Composantes, je te laisse retrouver les corrrespondances (manque de temps et pas de Delphi au boulot), tu satures chaque composante en ajoutant 4 par exemple, ce qui te rapproche du blanc et donc éclaircit les couleurs.

    @+

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    174
    Points
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 174
    Points : 38
    Par défaut ca y est
    J'ai trouvé la solution pour générer des couleurs satisfaisantes.
    Je passe un paramètre en entrée de ma fonction, la couleur générée estensuite mélangée avec cette couleur en paramètre.
    Ca me permet d'obtenir des couleurs dans une teinte donnée. Si je passe en paramètre la couleur clWhite, j'obtiens des couleurs pastel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      //Mixage de la couleur tirée au sort avec la couleur passée en paramètre
      l_red := (l_red + GetRValue(pMixColor)) div 2;
      l_green := (l_green + GetGValue(pMixColor)) div 2;
      l_blue := (l_blue + GetBValue(pMixColor)) div 2;
     
      Result := RGB(l_red, l_green,l_blue);

  8. #8
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 564
    Points
    3 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 564
    Points : 3 968
    Par défaut
    Ma réponse (l'ajout de 4) du dessus est bancale, désolé, elle ne tient pas compte des dépassement de capacité.
    Il suffit d'appliquer un masque avec un OR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      ...
      l_red := l_red OR 128;
      l_green := l_green OR 128;
      l_blue := l_blue OR 128;
      ...
    Cela force le bit de plus fort poids à 1 s'il ne l'est pas déjà, auquel cas la couleur est sans doute déjà assez claire.

    @+

  9. #9
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Points
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Par défaut
    Sinon, tu peux toujours passer ta couleur en TLS, et vérifier que la luminosité est insuffisante, auquel cas tu l'augmente et la reconvertit en RGB.
    Je crois que GR32 gère les conversions RVB <-> TLS

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juillet 2003
    Messages
    51
    Points
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 51
    Points : 33
    Par défaut
    une couleur claire sera une couleur dont les 3 composantes R G et B se rapprochent de 255. ( blanc: 255, 255, 255 ).
    partant de la il suffirait de définir un seuil en dessous duquel on considère une couleur trop sombre ( pour un background je choisirais une valeur assez elevée style 190 )

    Du coup :

    monSeuil := 190;
    maxColor := 255;

    myColor := RGB( random( monSeuil, maxColor ), random( monSeuil, maxColor ), random( monSeuil, maxColor ));

  11. #11
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Points
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Par défaut
    Citation Envoyé par niocco Voir le message
    une couleur claire sera une couleur dont les 3 composantes R G et B se rapprochent de 255. ( blanc: 255, 255, 255 ).
    partant de la il suffirait de définir un seuil en dessous duquel on considère une couleur trop sombre ( pour un background je choisirais une valeur assez elevée style 190 )
    Pas vraiment, c'est l'ensemble des composantes qui définit si la couleur est claire. Par exemple, clAqua ($ffff00) est une couleur claire, et pourtant sa composante rouge est 0 !

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Points
    3 266
    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
    Par défaut
    Bonjour,

    Guillemouze : Pas vraiment, c'est l'ensemble des composantes qui définit si la couleur est claire. Par exemple, clAqua ($ffff00) est une couleur claire, et pourtant sa composante rouge est 0 !
    Exact, et clAqua converti en sa nuance de gris c'est environ kif-kif à la luminosité soit un gris de (255 + 255 + 0) div 3 = 170 soit du RGB(170,170,170) d'où un seuil de 170.

    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function clAleatoireFond(const monSeuil: byte; CouleurInterdite: tColor): tColor;
    var Gris, R, G, B: integer;
    begin
      repeat
        R := random(256); G := random(256); B := random(256);
        Gris := (R + G + B) div 3;
        Result := RGB(R, G, B);
      until (Gris >= monSeuil) and (Result <> CouleurInterdite);
    end;
    A+.

  13. #13
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 564
    Points
    3 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 564
    Points : 3 968
    Par défaut
    Salut

    @Gilbert, en faisant la moyenne des trois composantes, on obtient donc une indication sur la luminosité, je ne savais pas, c'est une bonne info, on peut avoir des précisions ?

    @+

  14. #14
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Points
    3 266
    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
    Par défaut
    Re-bonjour,

    E-ric : en faisant la moyenne des trois composantes, on obtient donc une indication sur la luminosité, je ne savais pas, c'est une bonne info, on peut avoir des précisions ?
    En fait on obtient l'équivalent du gris des anciens téléviseurs en "noir et blanc" avec la formule NTSC suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Gris := integer( 77*rgbtRed + 150*rgbtGreen + 29*rgbtBlue) shr 8; 
    ce qui est égal à Gris1 = 0,3007*R + 0,5859*G +  0,1133*B;
    donc si on prend Gris2 = moyenne des 3 c'est à dire 0,3333*R + 0,3333*G + 0,3333*B on privilégie le Rouge et le Bleu au détriment du Vert ce qui donne un Gris2 un chouilla plus sombre que Gris1 puisque la plage de plus grande sensibilité de l'oeil se trouve dans celle des Verts-Jaunes .

    Mais rien n'empêche d'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function clAleatoireFond(const monSeuil: byte; CouleurInterdite: tColor): tColor;
    var Gris, R, G, B: integer;
    begin
      repeat
        R := random(256); G := random(256); B := random(256);
        Gris := trunc(0.3007 * R + 0.5859 * G +  0.1133 * B);
        Result := RGB(R, G, B);
      until (Gris >= monSeuil) and (Result <> CouleurInterdite);
    end;
    A+.

  15. #15
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Points
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Salut

    @Gilbert, en faisant la moyenne des trois composantes, on obtient donc une indication sur la luminosité, je ne savais pas, c'est une bonne info, on peut avoir des précisions ?

    @+
    J'ai regardé le code de la fonction GR32.RGBtoHSL, et le calcul de la luminosité est le suivant :
    ( Min(R,G,B) + Max(R,G,B) ) / 2
    avec RGB € [0,1] et donc la luminosité aussi entre 0 et 1

  16. #16
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Points
    3 266
    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
    Par défaut
    Bonjour,

    Guillemouze : ... GR32.RGBtoHSL, et le calcul de la luminosité est le suivant : ( Min(R,G,B) + Max(R,G,B) ) / 2
    A mon avis, que l'on s'appuie sur le calcul de la luminosité ou de la valeur du niveau de Gris, le résultat final sera à peu près kif-kif car dans les deux cas le résultat final dépendra surtout de la valeur retenue pour le paramètre "monSeuil".

    A+.

Discussions similaires

  1. Tirage Aléatoire unique ..
    Par FoX_McClouD dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/06/2006, 14h48
  2. tirage aléatoire
    Par uloaccess dans le forum Access
    Réponses: 10
    Dernier message: 22/02/2006, 19h02
  3. Tirage aléatoire dans une base donnée
    Par leloup84 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 30/01/2006, 17h13
  4. génération aléatoire de couleur claire
    Par jiraiya dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 25/02/2004, 20h52
  5. Eviter deux nombres identiques dans un tirage aléatoire
    Par moon tiger dans le forum Pascal
    Réponses: 5
    Dernier message: 25/11/2002, 10h57

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