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

Développement 2D, 3D et Jeux Discussion :

Associer une couleur


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut Associer une couleur
    Bonjour,

    Ma question est toute bête : comment pourrais-je associer une couleur RGB à une température ?

    Je dispose d'un champ de température T_k, pour k variant de 1 à L. Je connais aussi Tmax et Tmin, les températures respectivement max et min rencontrées. A partir de là, j'aimerais pouvoir associer à T_k une couleur selon son intensité relative : plus T_k est proche de Tmax, plus la couleur tend vers le violet, et plus elle est proche de Tmin, plus elle temps vers le rouge (cf spectre EM des couleurs).

    Pour cela, je me suis fait une échelle hexadécimale : à T_k j'associe l'entier (T_k-Tmin)/(Tmax-Tmin) * 256^3 - 1, que je convertie en hexadécimal. A priori, a Tmin j'ai du noir (froid, sans rayonnement), et à Tmax du blanc. Ensuite, je récupère les composantes rgb avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void Convert(const char* input, int* r, int*g, int*b)
    {
     
     int num = strtol(input + 1, NULL, 16);
     (*r) = (num & 0xFF0000) >> 16;
     (*g) = (num & 0xFF00) >> 8;
     (*b) = num & 0xFF;
     
    }

    Et là le résultat est assez surprenant... ca me donne de jolies ensembles de couleurs, mais rien de très cohérent...

    Une petite idée ?

    Merci

    Cordialement
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    Deux questions:
    -Pourquoi est-ce que ton entrée est en chaine de caractères?
    - Pourquoi dans "strtol(input + 1, NULL, 16);" tu utilise "input + 1"?

    Ce n'est pas plus simple d'utiliser des entiers pour input, non?

    C'est apparement à la conversion de la chaine en long que se déroule le problème (parce que je viens de tester le reste de ta fonction qui fonctionne parfaitement).

    Ajoute un peu après " int num = strtol(input + 1, NULL, 16);" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s %x", input, num);
    Si tu as la même valeur qui est affichée ou pas?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut
    Bien vu, il manque le premier caractère...

    J'ai changé le code en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void Convert(const int num, int* r, int*g, int*b)
    {
     (*r) = (num & 0xFF0000) >> 16;
     (*g) = (num & 0xFF00) >> 8;
     (*b) = num & 0xFF;
    }
    Et voici le code supposé faire la conversion
    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
     
    double val1,val2;
    	char hex[16];
    	int r,g,b;
     
    	for (int i=0;i< v->size(); i++ )
    	{
    		val1 = (*v)(i)/200;
    		val2 = val1;
    		val2 *= 256*256*256;
     
    		if( val2 > 0 )
    			val2--;
     
    		Convert(val2,&r,&g,&b);
     
    		glColor3ub(r,g,b);		
     
    		glVertex2f(i*640/Nm,val1*480);	
    	}
    200 étant le maximum des valeurs stockées dans mon vecteur v...

    Merci du coup de main

    Cordialement
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 38
    Points
    38
    Par défaut
    (et un nouveau problème de résolu!)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut
    Ah mais non, je me suis mal exprimé : Le problème est toujours là....

    Ca donne des trucs pas cohérents, du genre du bleu et du vert avec du noir entre deux... Pourtant, je ne vois pas trop ce qui ne va pas dans l'algo (enfin si, mais je n'en vois pas d'autre)

    Merci
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

  6. #6
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    il faut que tu fasses varier la hue (ok "teinte" pour les anglophobes) à intensité (ou presque) constante.

    Par exemple avec une relation linéaire par morceau telle que celle-ci :
    http://en.wikipedia.org/wiki/Image:H...comparison.svg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut
    Merci beaucoup, je vais essayer ce week end !
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/08/2013, 17h06
  2. associer un nom à une couleur
    Par awalter1 dans le forum Mise en page CSS
    Réponses: 12
    Dernier message: 10/03/2012, 18h17
  3. Associer une couleur à un chiffre
    Par Docten dans le forum Windows Forms
    Réponses: 29
    Dernier message: 08/02/2010, 18h58
  4. Réponses: 8
    Dernier message: 30/03/2009, 15h31
  5. Associer une couleur à un nombre
    Par lolow dans le forum LabVIEW
    Réponses: 1
    Dernier message: 22/12/2007, 02h36

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