Nuancer une couleur
Résolu/Fermé
A voir également:
- Nuancer une couleur
- Excel cellule couleur si condition texte - Guide
- Somme si couleur - Guide
- La boite a couleur - Télécharger - Divers Photo & Graphisme
- Nb si couleur ne fonctionne pas ✓ - Forum Excel
- Code couleur résistance - Télécharger - Vie quotidienne
3 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
15 mars 2015 à 16:42
15 mars 2015 à 16:42
Bonjour,
Il faut utiliser la classe Color.
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()); } } }
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
15 mars 2015 à 18:05
15 mars 2015 à 18:05
C'est du Java's Cool ? Quel proglet tu utilises pour avoir setPixel ?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
15 mars 2015 à 19:19
15 mars 2015 à 19:19
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.
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.
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.
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.
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.
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 :
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); }