Estou escrevendo um jogo em Java e quero implementar um medidor de energia para determinar com que intensidade você vai atirar em algo.
Preciso escrever uma função que tenha um int entre 0 - 100 e, com base em quão alto é esse número, ele retornará uma cor entre Verde (0 na escala de potência) e Vermelho (100 na escala de potência).
Semelhante à maneira como os controles de volume funcionam:
Que operação eu preciso fazer nos componentes Vermelho, Verde e Azul de uma cor para gerar as cores entre Verde e Vermelho?
Então, eu poderia dizer, getColor(80)
e ele retornará uma cor alaranjada (seus valores em R, G, B) ou getColor(10)
que retornará um valor RGB mais Verde / Amarelo.
Sei que preciso aumentar os componentes dos valores R, G, B para uma nova cor, mas não sei especificamente o que aumenta ou diminui à medida que as cores mudam de Verde-Vermelho.
Progresso:
Acabei usando o espaço de cores HSV / HSB porque gostei mais da gradiant (sem marrom escuro no meio).
A função que eu usei foi:
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);
}
Onde "potência" é um número entre 0,0 e 1,0. 0.0 retornará um vermelho brilhante, 1.0 retornará um verde brilhante.
Gráfico de Matiz Java:
Respostas:
Isso deve funcionar - basta dimensionar linearmente os valores de vermelho e verde. Supondo que seu valor máximo de vermelho / verde / azul esteja
255
en
esteja dentro do alcance0 .. 100
(Alterado para números inteiros, ponta do chapéu para Ferrucio)
Outra maneira de fazer isso seria usar um modelo de cores HSV e alternar o tom de
0 degrees
(vermelho) para120 degrees
(verde) com a saturação e o valor que mais lhe convierem. Isso deve dar um gradiente mais agradável.Aqui está uma demonstração de cada técnica - o gradiente superior usa RGB, o inferior usa HSV:
fonte
Em cima da minha cabeça, aqui está a transição de matiz verde-vermelho no espaço HSV, traduzida para RGB:
Os valores de vermelho, verde e azul no exemplo acima são porcentagens. Você provavelmente deseja multiplicá-los por 255 para obter o intervalo de 0 a 255 mais usado.
fonte
Resposta curta Copy'n'Paste ...
No Java Std:
No Android:
nota: value é um número entre 0 e 1, indicando a condição de vermelho para verde.
fonte
String.format("#%06X", 0xFFFFFF & getTrafficlightColor(value));
Se você deseja uma representação verde-amarela-vermelha como a resposta aceita sugere, dê uma olhada nisso.
http://jsfiddle.net/0awncw5u/2/
fonte
A interpolação linear entre verde e vermelho quase deve funcionar, exceto que no meio haverá cor marrom enlameada.
A solução mais flexível e com melhor aparência é ter um arquivo de imagem em algum lugar com a rampa de cores exata desejada. E, em seguida, procure o valor de pixel lá. Isso tem a flexibilidade de que você pode ajustar o gradiente para ficar perfeito .
Se você ainda deseja fazer isso a partir do código, provavelmente é melhor interpolar entre as cores verde e amarelo no lado esquerdo e entre amarelo e vermelho no lado direito. No espaço RGB, verde é (R = 0, G = 255, B = 0), amarelo é (R = 255, G = 255, B = 0), vermelho é (R = 255, G = 0, B = 0 ) - isso pressupõe que cada componente de cor passa de 0 a 255.
fonte
Eu fiz uma pequena função que fornece o valor inteiro rgb para um valor percentual:
Portanto, se o seu currentValue for 50 e o maxValue for 100, essa função retornará a cor que você precisa, portanto, se você repetir esta função com um valor percentual, o valor da cor passará de verde para vermelho. Desculpe pela explicação ruim
fonte
A resposta aceita nem sequer respondeu à pergunta ...
C ++
Aqui está um segmento de código C ++ simples do meu mecanismo que interpola linear e eficientemente entre três cores arbitrárias:
A
interpolation_factor
é assumida para estar na gama de0.0 ... 1.0
.Presume-se que as cores estejam na faixa de
0.0 ... 1.0
(por exemplo, para OpenGL).C #
Aqui está a mesma função escrita em C #:
A
interpolationFactor
é assumida para estar na gama de0.0 ... 1.0
.Presume-se que as cores estejam na faixa de
0 ... 255
.fonte
Você precisa interpolar linearmente (LERP) os componentes de cores. Veja como isso é feito, em geral, dado um valor inicial v0 , um valor final v1 e a taxa necessária (uma flutuação normalizada entre 0,0 e 1,0):
Isso fornece v0 quando a proporção é 0,0, v1 quando a proporção é 1,0 e tudo o que existe entre os outros casos.
Você pode fazer isso nos componentes RGB ou usando outro esquema de cores, como HSV ou HLS. Os dois últimos serão mais agradáveis visualmente, pois trabalham com componentes de matiz e brilho que mapeiam melhor a nossa percepção de cores.
fonte
Eu diria que você quer algo entre um segmento de linha no espaço HSV (que tem um amarelo levemente brilhante demais no centro) e um segmento de linha no espaço RGB (que tem um marrom feio no centro). Eu usaria isso, onde
power = 0
darei verde,power = 50
darei um amarelo levemente opaco epower = 100
darei vermelho.fonte
Aqui está a solução de copiar e colar para as escalas Swift e HSV:
O inicializador UIColor aceita matiz, saturação e brilho em [0, 1]; portanto, para um determinado valor de [0, 1], temos:
fonte
fonte
Se você precisar desse tipo de gradiente (na verdade, invertido) em CSS (versão mínima 2.1), também poderá usar o HSL.
Supondo que você esteja em um modelo AngularJs e o valor seja um número de 0 a 1 e que você queira estilizar um elemento (cor de fundo ou de texto) ...
Primeiro valor: graus (0 vermelho, 120 verde) Segundo valor: saturação (50% é neutro) Terceiro valor: luminosidade (50% neutro)
Um bom artigo aqui
Teoria na Wikipedia aqui
fonte
Aqui está a
Objective-C
versão da solução da Simucal:Onde nível seria um valor entre
0.0
e1.0
.Espero que isso ajude alguém!
fonte
No Python 2.7:
Por cento é claro
value / max_value
. Ou se sua escala não começar em 0, então(value - min_value) / (max_value - min_value)
.fonte
Javascript
Estou usando o Google Visualization com gráfico de barras e queria que as barras ficassem verdes e vermelhas com base em uma porcentagem. Acabou sendo a solução mais limpa que encontrei e funciona perfeitamente.
Apenas verifique se o seu percentual é 50 para 50% e não para 0,50.
fonte
Atualizei a resposta aceita dividindo-a na primeira e na segunda metade do intervalo (0,100) e substituindo 100 por um nível máximo, para que o intervalo possa se tornar dinâmico. O resultado é exatamente como no modelo HSV, mas ainda usando RGB. A chave é ter o (255.255,0) no meio para representar a cor amarela. Combinei essa idéia na resposta aceita e em outro código VBA, para alcançá-la no VBA e usar no Excel. Espero que a lógica ajude e possa ser usada em outros idiomas / aplicativos.
Saúde, Pavlin
fonte
VB
fonte
Exemplo independente
fonte
Isso varia de vermelho a amarelo e, em seguida, a verde o
valor varia de 0 a 100
fonte