J'écris un jeu Java et je veux implémenter un wattmètre pour savoir à quel point vous allez tirer quelque chose.
J'ai besoin d'écrire une fonction qui prend un int entre 0 - 100, et en fonction de la hauteur de ce nombre, elle renverra une couleur entre le vert (0 sur l'échelle de puissance) et le rouge (100 sur l'échelle de puissance).
Similaire au fonctionnement des commandes de volume:
Quelle opération dois-je effectuer sur les composants rouge, vert et bleu d'une couleur pour générer les couleurs entre le vert et le rouge?
Donc, je pourrais courir dire, getColor(80)
et il renverra une couleur orangée (ses valeurs en R, V, B) ou getColor(10)
qui renverra une valeur RVB plus verte / jaune.
Je sais que j'ai besoin d'augmenter les composants des valeurs R, V, B pour une nouvelle couleur, mais je ne sais pas spécifiquement ce qui augmente ou diminue lorsque les couleurs passent du vert au rouge.
Le progrès:
J'ai fini par utiliser l'espace colorimétrique HSV / HSB parce que j'aimais mieux le dégradé (pas de brun foncé au milieu).
La fonction que j'ai utilisée était:
public Color getColor(double power)
{
double H = power * 0.4; // Hue (note 0.4 = Green, see huge chart below)
double S = 0.9; // Saturation
double B = 0.9; // Brightness
return Color.getHSBColor((float)H, (float)S, (float)B);
}
Où «puissance» est un nombre compris entre 0,0 et 1,0. 0.0 renvoie un rouge vif, 1.0 renvoie un vert brillant.
Graphique de teinte Java:
Réponses:
Cela devrait fonctionner - il suffit de mettre à l'échelle linéairement les valeurs rouge et verte. En supposant que votre valeur maximale rouge / vert / bleu est
255
, etn
est dans la plage0 .. 100
(Modifié pour les maths entiers, pointe du chapeau à Ferrucio)
Une autre façon de faire serait d'utiliser un modèle de couleur HSV et de faire passer la teinte de
0 degrees
(rouge) à120 degrees
(vert) avec la saturation et la valeur qui vous conviennent. Cela devrait donner un dégradé plus agréable.Voici une démonstration de chaque technique - le dégradé supérieur utilise RVB, le bas utilise HSV:
la source
Du haut de ma tête, voici la transition de teinte vert-rouge dans l'espace HSV, traduite en RVB:
Les valeurs rouge, verte et bleue de l'exemple ci-dessus sont des pourcentages, vous voudrez probablement les multiplier par 255 pour obtenir la plage 0-255 la plus utilisée.
la source
Réponse courte Copy'n'Paste ...
Sur Java Std:
Sur Android:
Remarque: la valeur est un nombre compris entre 0 et 1 indiquant la condition du rouge au vert.
la source
String.format("#%06X", 0xFFFFFF & getTrafficlightColor(value));
Si vous voulez une représentation vert-jaune-rouge comme le suggère la réponse acceptée, jetez un œil à ceci.
http://jsfiddle.net/0awncw5u/2/
la source
L'interpolation linéaire entre le vert et le rouge devrait presque fonctionner, sauf qu'au milieu, il y aura une couleur marron boueux.
La solution la plus flexible et la plus esthétique est d'avoir un fichier image quelque part qui a la rampe de couleurs exacte que vous voulez. Et puis recherchez la valeur de pixel là-dedans. Cela a la flexibilité que vous pouvez modifier le dégradé pour qu'il soit juste .
Si vous voulez toujours le faire à partir du code, il est probablement préférable d'interpoler entre les couleurs verte et jaune sur le côté gauche et entre le jaune et le rouge sur le côté droit. Dans l'espace RVB, le vert est (R = 0, G = 255, B = 0), le jaune est (R = 255, G = 255, B = 0), le rouge est (R = 255, G = 0, B = 0) ) - cela suppose que chaque composante de couleur passe de 0 à 255.
la source
J'ai créé une petite fonction qui vous donne la valeur entière rgb pour une valeur en pourcentage:
Donc, si votre currentValue est de 50 et votre maxValue de 100, cette fonction renverra la couleur dont vous avez besoin, donc si vous bouclez cette fonction avec une valeur de pourcentage, votre valeur de couleur passera du vert au rouge. Désolé pour la mauvaise explication
la source
La réponse acceptée n'a même pas vraiment répondu à la question ...
C ++
Voici un simple segment de code C ++ de mon moteur qui interpole de manière linéaire et efficace entre trois couleurs arbitraires:
On
interpolation_factor
suppose que le est dans la plage de0.0 ... 1.0
.Les couleurs sont supposées être dans la plage de
0.0 ... 1.0
(par exemple pour OpenGL).C #
Voici la même fonction écrite en C #:
On
interpolationFactor
suppose que le est dans la plage de0.0 ... 1.0
.Les couleurs sont supposées être de l'ordre de
0 ... 255
.la source
Vous devez interpoler linéairement (LERP) les composants de couleur. Voici comment cela se fait en général, étant donné une valeur de départ v0 , une valeur de fin v1 et le rapport requis (un flottant normalisé entre 0,0 et 1,0):
Cela donne v0 lorsque le rapport est de 0,0, v1 lorsque le rapport est de 1,0, et tout le reste dans les autres cas.
Vous pouvez le faire soit sur les composants RVB, soit en utilisant un autre jeu de couleurs, comme HSV ou HLS. Les deux derniers seront plus agréables visuellement, car ils fonctionnent sur des composants de teinte et de luminosité qui correspondent mieux à notre perception des couleurs.
la source
Je dirais que vous voulez quelque chose entre un segment de ligne dans l'espace HSV (qui a un jaune légèrement trop brillant au centre) et un segment de ligne dans l'espace RVB (qui a un vilain brun au centre). J'utiliserais ceci, où
power = 0
donnera du vert,power = 50
donnera un jaune légèrement terne etpower = 100
donnera du rouge.la source
Voici une solution de copier-coller pour les échelles Swift et HSV:
L'initialiseur UIColor accepte la teinte, la saturation et la luminosité dans [0, 1] donc pour une valeur donnée de [0, 1] nous avons:
la source
la source
Si vous avez besoin de ce type de dégradé (en fait inversé) en CSS (version minimale 2.1), vous pouvez également utiliser HSL.
Supposons que vous soyez dans un modèle AngularJs et que la valeur soit un nombre de 0 à 1 et que vous souhaitiez styliser un élément (couleur d'arrière-plan ou de texte) ...
Première valeur: degrés (0 rouge, 120 vert) Deuxième valeur: saturation (50% est neutre) Troisième valeur: clarté (50% neutre)
Un bel article ici
Théorie sur Wikipedia ici
la source
Voici la
Objective-C
version de la solution Simucal:Où level serait une valeur entre
0.0
et1.0
.J'espère que cela aide quelqu'un!
la source
Dans Python 2.7:
Le pourcentage est bien sûr
value / max_value
. Ou si votre échelle ne commence pas à 0 alors(value - min_value) / (max_value - min_value)
.la source
JavaScript
J'utilise la visualisation Google avec un graphique à barres et je voulais que les barres soient vertes à rouges en fonction d'un pourcentage. Cela s'est avéré être la solution la plus propre que j'ai trouvée et fonctionne parfaitement.
Assurez-vous simplement que votre pourcentage est de 50 pour 50% et non de 0,50.
la source
J'ai mis à jour la réponse acceptée en la divisant en première et seconde moitié de la plage (0,100) et en remplaçant 100 par un niveau maximum, afin que la plage puisse devenir dynamique. Le résultat est exactement comme avec le modèle HSV, mais toujours en utilisant RVB. La clé est d'avoir le (255,255,0) au milieu pour représenter la couleur jaune. J'ai combiné cette idée dans la réponse acceptée et un autre code VBA, alors réalisez-la dans VBA et utilisez-la dans Excel. J'espère que la logique aide et peut être utilisée dans d'autres langages / applications.
Salutations, Pavlin
la source
VB
la source
Exemple autonome
la source
Cela variera du rouge au jaune puis au vert la
valeur varie de 0 à 100
la source