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

C Discussion :

Mix de couleurs


Sujet :

C

  1. #1
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut Mix de couleurs
    Désolé si je suis hors topic mais comme il n'y en a aucun traitant de programmation générale et que mon code est un code écrit en C, je poste ici.

    Dans l'objectif de réaliser un simulateur de vie réaliste, ca c'est fait mais pour le rendre plus réaliste, je souhaiterai géré les couleurs. Je m'explique:

    Soit un individu x de couleur r = 0, g = 0 et b = 0 et un individu y de couleur r = 255, g = 255 et b = 255, lors de la création d'un autre individu via x et y, il faudrait que la couleur de l'individu z soit grise.

    J'ai pensé à une fonction qui se comporterai comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int mix_color(int color1, int color2)
    {
        int color = 0;
     
        color = ((color1+color2)/2);
     
        return color;
    }
    Et l'appliquer pour r, g et b mais le resultat n'est pas super du tout (individu noir + individu violet = vert ?! Kesako ?)

    Je suis parti sur http://www.glums.com/melangeur_de_couleur/ mais leur code source c'est du html et puis je ne connais pas du tout le html Même si je sais que c'est 100 fois plus facile que le C. Pourriez vous m'aider à réaliser cette fonction (me dire sans le code bien entendu mais avec des mots, comment faire pour réaliser ce genre de fonction).

    Si je me suis trompé de sous partie de forum, merci de me diriger vers un endroit plus convenable.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Par défaut
    En réponse a ton site ,
    le code source sur le site qui mélange les couleurs
    est en 'javascript' , il faut etre un chevronné pour pouvoir le décoder

  3. #3
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    C'est galère Je ne demande pas un code tout fait mais simplement comment faire en "français" pour mixer deux couleurs RGB .

    Une idée ?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    C'est pourtant simple: Tu fais la moyenne des octets deux à deux...
    Et tu peux même te moquer de l'ordre ou l'endianness, puisque c'est toujours séparé en octets:
    Code C : 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
    int mix_color(int const color1, int const color2)
    {
        unsigned char const * const u1 = (unsigned char const *)&color1;
        unsigned char const * const u2 = (unsigned char const *)&color2;
        int ret;
        unsigned char * const ur = (unsigned char *)&ret;
        size_t i;
     
        for(i=0 ; i<sizeof ret ; i++)
        {
            int val = u1[i] + u2[i];
            val /= 2;
            ur[i] = (unsigned char)val;
        }
        return ret;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    voilà la traduction du code javascript en C:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #define ETAPE 2                 /* choisis au hasard */
     
    typedef struct
    {
       unsigned char r;             /* red */
       unsigned char g;             /* green */
       unsigned char b;             /* blue */
       unsigned char dummy;         /* alignment */
    } color;
     
    int calculerCouleur (color const *color1, color const *color2,
                         color ** tabColor, int etape);
     
    int main (void)
    {
       int ret = EXIT_FAILURE;
       color *tabColor = NULL;      /* tableau contenant les couleurs intermédiaires */
       color color1 = { 153, 255, 0 };
       color color2 = { 204, 102, 204 };
     
       if (calculerCouleur (&color1, &color2, &tabColor, ETAPE))
       {
          int i;
          for (i = 0; i < ETAPE + 2; i++)
          {
             printf ("rgb(%hhu,%hhu,%hhu)\n", tabColor[i].r, tabColor[i].g,
                     tabColor[i].b);
          }
          ret = EXIT_SUCCESS;
       }
     
       return ret;
    }
     
    int calculerCouleur (color const *color1, color const *color2,
                         color ** tabColor, int step)
    {
       int ret = 0;
       color pattern;
       step++;
     
       pattern.r =
          (unsigned char) floor ((color2->r - color1->r) / (double) step + 0.5);
       pattern.g =
          (unsigned char) floor ((color2->g - color1->g) / (double) step + 0.5);
       pattern.b =
          (unsigned char) floor ((color2->b - color1->b) / (double) step + 0.5);
     
       *tabColor = malloc ((step + 1) * sizeof **tabColor);
       if (*tabColor != NULL)
       {
          color *tab = *tabColor;
          int i = 0;
          tab[0] = *color1;
          tab[step] = *color2;
          for (i = 1; i < step; i++)
          {
             tab[i].r = (unsigned char) (color1->r + pattern.r * i);
             tab[i].g = (unsigned char) (color1->g + pattern.g * i);
             tab[i].b = (unsigned char) (color1->b + pattern.b * i);
          }
          ret = 1;
       }
     
       return ret;
    }
    la gestion d'erreur est minimale, libre à toi de l'améliorer.
    Cordialement.

  6. #6
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    C'est sympa Mais c'est pas trop ce que je voulais, je voulais le faire seul. Enfin rien ne m'enpeche de partir de votre code
    Mais pouvez vous m'expliquer comment ca fonction en gros sans parler de code car j'ai pas le temps d'étudier votre code de suite, je m'y mettrai ce week end (c'est la faute au controle de physique prévu pour demain )

    Merci d'avance

    EDIT: finalement, pouvez vous m'expliquer la fonction ...couleur (j'ai oublié le nom), je ne pige pas tout.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Apparemment, la fonction calculerCouleur sert à faire un gradient de step couleurs d'une couleur à l'autre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Apparemment, la fonction calculerCouleur sert à faire un gradient de step couleurs d'une couleur à l'autre.
    Exactement, la fonction calculerCouleur() reçoit 2 couleurs (color1 et color2) et calcule le gradient entre ces 2 couleurs pour le nombre d'étape indiqué (en 4ème paramètre) et stocke le tout dans un tableau tabColor (3ème paramètre). ça fonctionne comme le lien que que tu as donné.
    Cordialement.

  9. #9
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Désolé si je suis hors topic mais comme il n'y en a aucun traitant de programmation générale et que mon code est un code écrit en C, je poste ici.

    Dans l'objectif de réaliser un simulateur de vie réaliste, ca c'est fait mais pour le rendre plus réaliste, je souhaiterai géré les couleurs. Je m'explique:

    Soit un individu x de couleur r = 0, g = 0 et b = 0 et un individu y de couleur r = 255, g = 255 et b = 255, lors de la création d'un autre individu via x et y, il faudrait que la couleur de l'individu z soit grise.

    J'ai pensé à une fonction qui se comporterai comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int mix_color(int color1, int color2)
    {
        int color = 0;
     
        color = ((color1+color2)/2);
     
        return color;
    }
    Non il faut faire :
    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
    int mix_color(int color1, int color2)
    {
        int r1 = get_r_value(color1);
        int g1 = get_g_value(color1);
        int b1 = get_b_value(color1);
     
        int r2 = get_r_value(color2);
        int g2 = get_g_value(color2);
        int b2 = get_b_value(color2);
     
        int r = (r1 + r2) / 2;
        int g = (g1 + g2) / 2;
        int b = (b1 + b2) / 2;
     
        return r_g_b(r, g, b);
    }
    Si t'as déjà fais de la synthèse d'images (OpenGL par exemple), tu devrais savoir qu'il n'y a pas une seule formule de mélange de couleur (blending). En fait, c'est à chacun de définir comment les couleurs doivent se mélanger. Naturellement, la solution que j'ai donné est la bonne.

  10. #10
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    La solution qu'a posté le membre au desuss de moi est elle bonne (simple verification car j'ai pas le temps de tester). Si oui, alors c'est super car la méthode que me donne nicolas.stibon (enfin la méthode du site) est plutôt compliqué, en terme de code ok mais c'est plus toute cette histoire de gradiant (vrailment nécessaire ?). Je vais m'informer sur ca. Je suis dans le C et la SDL (pas encore l'openGL)

    Merci d'avance

  11. #11
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Melem: Ta fonction et ma fonction sont les même ! Sauf que moi, je l'applique 3 fois (pour entit1.couleur.r, ....g, ....b) Je vais donc me débrouiller avec ce que l'on m'a donné

    Je poste résolu.

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    je signale à tout hasard qu'il y a plusieurs représentations des couleurs....

    RGB en est une, mais qui ne permet que très difficlement ce que tu souhaites.

    Le meilleur modèle pour ceci est HSL (Hue Saturation Luminosity).

    Des formules et des algos de conversion de l'un dans l'autre existe.

    Et dans ce modèle, les interpolations sont directes et les opérations mathématiques aussi....

  13. #13
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Surement mais la SDL me propose RGB et je trouve ca super simple. De plus, je n'ai pas besoin de quelque chose de bien compliqué pour appliquer une couleur à un pauvre carré.

    Enfin, je viens de vérifier et ma solution de départ (confirmée par Melem) fonctionne très bien

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

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. Mixe couleur dans TCanvas
    Par morind79 dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2008, 13h26
  3. Couleur d'une JComboBox disabled
    Par ced dans le forum Composants
    Réponses: 6
    Dernier message: 06/01/2004, 15h33
  4. Mixage de Couleurs
    Par exxos dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 29/05/2002, 13h34
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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