Nuancer une couleur

[Résolu/Fermé]
Signaler
-
 TheCastleGaming -
Bonjour,
J'ai un carré de couleur rouge que j'affiche grâce à mon code:
for (x =350; x <450; x ++) {
for (y =50; y <=150; y ++) {
rouge[x][y] = 255;
vert[x][y] =0;
bleu[x][y] =0;
setPixel(x, y, rouge[x][y], vert[x][y], bleu[x][y]);
}
}
Ce carré rouge s'affiche.
Je cherche à afficher un autre carré d'une nuance de ce rouge plus clair.
J'ai entendu parler d'une fonction color.brighter() mais je ne sais pas m'en servir?

Quelqu'un peut m'aider?
Merci d'avance.


3 réponses

Messages postés
16400
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 septembre 2021
2 879
Bonjour,

Il faut utiliser la classe Color.

Color clr = Color.RED; // ou Color.RED.brighter();
for (x =350; x <450; x ++) { 
for (y =50; y <=150; y ++) {
    setPixel(x, y, clr.getRed(), clr.getGreen(), clr.getBlue()); 
} 
}

Résultat: j'ai mon carré, et à coté au lieu d'avoir un carré de nuance plus claire, j'ai un carré rouge.
import java.awt. *;

/*
 * Le repère n'est pas centré, il va de haut en bas et de gauche à droite vers le sens positif */
 void main() {
   int x,y,couleur;
   reset(800, 400, false);
   int[][] rouge = new int[800][400];
   int[][] vert = new int[800][400];
   int[][] bleu = new int[800][400];
   couleur = random(1, 6);
   switch(couleur) {
      case 1 : for (x =350; x <450; x ++) {
         for (y =50; y <=150; y ++) {
            rouge[x][y] = 255;
            vert[x][y] =0;
            bleu[x][y] =0;
            setPixel(x, y, rouge[x][y], vert[x][y], bleu[x][y]);
         }
      }
      break;
      case 2 : for (x =350; x <450; x ++) {
         for (y =50; y <=150; y ++) {
            rouge[x][y] = 0;
            vert[x][y] =255;
            bleu[x][y] =0;
            setPixel(x, y, rouge[x][y], vert[x][y], bleu[x][y]);
         }
      }
      break;
      case 3 : for (x =350; x <450; x ++) {
         for (y =50; y <=150; y ++) {
            rouge[x][y] = 0;
            vert[x][y] =0;
            bleu[x][y] =255;
            setPixel(x, y, rouge[x][y], vert[x][y], bleu[x][y]);
         }
      }
      break;
      case 4 : for (x =350; x <450; x ++) {
         for (y =50; y <=150; y ++) {
            rouge[x][y] = 255;
            vert[x][y] =255;
            bleu[x][y] =0;
            setPixel(x, y, rouge[x][y], vert[x][y], bleu[x][y]);
         }
      }
      break;
      case 5 : for (x =350; x <450; x ++) {
         for (y =50; y <=150; y ++) {
            rouge[x][y] = 255;
            vert[x][y] =0;
            bleu[x][y] =255;
            setPixel(x, y, rouge[x][y], vert[x][y], bleu[x][y]);
         }
      }
      break;
      case 6 : for (x =350; x <450; x ++) {
         for (y =50; y <=150; y ++) {
            rouge[x][y] = 0;
            vert[x][y] =255;
            bleu[x][y] =255;
            setPixel(x, y, rouge[x][y], vert[x][y], bleu[x][y]);
         }
      }
      break;
   }
   //Génération du carré (le plus a gauche) de même couleur que le principal généré au début
    for (x =200; x <300; x ++) {
      for (y =250; y <=350; y ++) {
         setPixel(x, y, rouge[400][100], vert[400][100], bleu[400][100]);
      }
   }

    Color clr = Color.RED.brighter();
   // ou Color.RED.brighter();
   for (x =350; x <450; x ++) {
      for (y =250; y <=350; y ++) {
         setPixel(x, y, clr.getRed(), clr.getGreen(), clr.getBlue());
      }
   }
}

Messages postés
16400
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 septembre 2021
2 879
C'est du Java's Cool ? Quel proglet tu utilises pour avoir setPixel ?

Exactement! Dire que je pensais que personne ne connaitrait... J'utilise CodagePixels!
Messages postés
16400
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
21 septembre 2021
2 879
J'en profite pour faire quelques remarques d'ordre général sur ton code.

1) Tes tableaux rouge, vert, bleu, ne servent à rien, tu peux t'en passer et utiliser uniquement une seule variable pour chaque composante.

int rouge = 0;
int vert = 0;
int bleu = 0;

couleur = random(1, 6);

switch(couleur) {
    case 1 :
        for (x =350; x <450; x ++) {
        for (y =50; y <=150; y ++) {
            rouge = 255;
            vert =0;
            bleu =0;
            setPixel(x, y, rouge, vert, bleu);
        }
        }
    break;
    // ...


2) Tu as fait 6 gros copier-coller dans ton switch, c'est clairement inutile, la seule chose qui change c'est la couleur du carré. Il suffit donc de changer juste les variables rouge, vert, bleu dans ton switch, et ensuite faire appel une seule fois à la double boucle for.

int rouge = 0;
int vert = 0;
int bleu = 0;

couleur = random(1, 6);

switch(couleur) {
   case 1 :
      rouge = 255;
      vert = 0;
      bleu = 0;
   break;
   case 2 :
      rouge = 0;
      vert = 255;
      bleu = 0;
   break;
   // ...
}

for (x = 350; x < 450; x ++) {
for (y = 50; y <= 150; y ++) {
   setPixel(x, y, rouge, vert, bleu);
}
}

3) Je t'ai montré tout à l'heure qu'il existait un objet Color permettant de remplacer tes 3 variables rouge, vert, bleu. Le switch ci-dessus peut donc se simplifier comme ceci.

Color clr = Color.BLACK;
   
couleur = random(1, 6);
   
switch(couleur) {
   case 1 :
      clr = Color.RED;
   break;
   case 2 :
      clr = Color.GREEN;
   break;
   case 3 :
      clr = Color.BLUE;
   break;
   case 4 :
      clr = Color.YELLOW;
   break;
   case 5 :
      clr = Color.MAGENTA;
   break;
   case 6 :
      clr = Color.CYAN;
   break;
}

int rouge = clr.getRed();
int vert = clr.getGreen();
int bleu = clr.getBlue();

Remarque : outre un gain en terme de concision du code, cela gagne surtout en sémantique, on comprends mieux à la lecture du code quelles sont les couleurs manipulées.

4) Pour ton problème de nuance (enfin) il semble que ce soit lié au fait que les couleurs que tu utilises sont saturées (à 255 ou 0), cela fonctionnerait bien avec des couleurs intermédiaires qui tendraient progressivement vers ces couleurs extrêmes que tu as déjà.
Il faudrait donc faire l'inverse et non pas utiliser brighter(), mais darker() pour obtenir une nuance visible.

for (x =350; x <450; x ++) {
for (y =250; y <=350; y ++) {
    setPixel(x, y, clr2.getRed(), clr2.getGreen(), clr2.getBlue());
}
}

Remarque : il est cependant possible de faire quand même une couleur plus clair, en manipulant les couleurs mais non plus dans un système RGB (red, green, blue) mais HSB (hue, saturation, brightness).
Sauf qu'au lieu d'augmenter la brightness (ce qui est impossible vu que l'on est déjà au maximum), on va diminuer la saturation, ce qui devrait permettre d'avoir une couleur plus claire.

float[] hsb = Color.RGBtoHSB(rouge, vert, bleu, null);
int rgb = Color.HSBtoRGB(hsb[0], 0.5f, hsb[2]);
    
Color clr2 = new Color(rgb);
   
for (x=350; x<450; x ++) {
for (y=250; y<=350; y ++) {
    setPixel(x, y, clr2.getRed(), clr2.getGreen(), clr2.getBlue());
}
}

5) Dernière remarques : je te conseilles d'utiliser un maximum de constantes dans ton code à la place de ce que l'on appelle les "valeurs magiques" c'est à dire des nombres comme tes 250, 350, 450 etc. qui serait plus simple de nommer dans des variables, de sorte à pouvoir être changées toute en même temps.
De plus déclares les variables uniquement quand tu en as besoin, pas globalement au début du code, quitte à la déclarer plusieurs fois (comme x et y) sauf que à chaque fois cela correspond à des données "différentes".

Code complet :

import java.awt.Color;

void main() {

   final int WIDTH = 550, HEIGHT = 550, SIZE = 100;
 	
   reset(WIDTH, HEIGHT, false);
   
   Color clr = Color.BLACK;
   
   int couleur =  random(1, 6);
   
   switch(couleur) {
      case 1 :
         clr = Color.RED;
         break;
      case 2 :
         clr = Color.GREEN;
         break;
      case 3 :
         clr = Color.BLUE;
         break;
      case 4 :
         clr = Color.YELLOW;
         break;
      case 5 :
         clr = Color.MAGENTA;
         break;
      case 6 :
         clr = Color.CYAN;
         break;
   }

   int rouge = clr.getRed();
   int vert = clr.getGreen();
   int bleu = clr.getBlue();

   final int X1 = 350, Y1 = 50;

   for (int x = X1; x < X1+SIZE; x ++)
   for (int y = Y1; y < Y1+SIZE; y ++)
       setPixel(x, y, rouge, vert, bleu);

   final int X2 = 200, Y2 = 250;
   
   for (int x = X2; x < X2+SIZE; x ++)
   for (int y = Y2; y < Y2+SIZE; y ++)
       setPixel(x, y, rouge, vert, bleu);

   final float LOW_SATURATION = 0.5f;

   float[] hsb = Color.RGBtoHSB(rouge, vert, bleu, null);
   int rgb = Color.HSBtoRGB(hsb[0], LOW_SATURATION, hsb[2]);
    
   Color clr2 = new Color(rgb);

   int rouge2 = clr2.getRed();
   int vert2 = clr2.getGreen();
   int bleu2 = clr2.getBlue();
   
   final int X3 = 350, Y3 = 250;

   for (int x = X3; x < X3+SIZE; x ++)
   for (int y = Y3; y < Y3+SIZE; y ++)
       setPixel(x, y, rouge2, vert2, bleu2);
}

Réponse claire et détaillée! Merci beaucoup d'avoir pris autant de temps pour tout KX!
Si tu veux voir un peu ce que je dois faire, mon cahier des charges est la: https://github.com/TheCastleGaming/Projet_ISN_Vision/blob/test_nuance/CONSIGNES.pdf?raw=true
Merci ;)