파워 미터에 빨간색과 녹색 사이의 색상을 생성 하시겠습니까?


137

Java 게임을 작성 중이며 무언가를 얼마나 열심히 쏠 지에 대한 파워 미터를 구현하고 싶습니다.

0에서 100 사이의 정수를 취하는 함수를 작성해야하며 그 숫자의 높이에 따라 녹색 (파워 스케일에서 0)과 빨간색 (파워 스케일에서 100) 사이의 색상을 반환합니다.

볼륨 컨트롤의 작동 방식과 유사합니다 :
볼륨 조절

녹색과 빨간색 사이의 색상을 생성하려면 색상의 빨강, 녹색 및 파랑 구성 요소에서 어떤 작업을 수행해야합니까?

그래서 나는 말할 수 있고 getColor(80), 그것은 오랑 지 색상 (R, G, B의 값) getColor(10)을 반환하거나 더 녹색 / 노란색 RGB 값을 반환합니다.

새 색상에 대해 R, G, B 값의 구성 요소를 늘려야한다는 것을 알고 있지만 녹색-빨간색에서 색상이 이동함에 따라 무엇이 올라가거나 내려가는 지 구체적으로 알 수 없습니다.


진행:

나는 gradiant를 더 좋아했기 때문에 HSV / HSB 색 공간을 사용했습니다 (중간에 어두운 갈색 없음).

내가 사용한 기능은 다음과 같습니다.

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);
}

여기서 "power"는 0.0과 1.0 사이의 숫자입니다. 0.0은 밝은 빨간색을, 1.0은 밝은 녹색을 반환합니다.

자바 색조 차트 :
자바 색조 차트


나는 이전에 여기에 같은 (매우 유사)과 같은 질문을했다 : http://stackoverflow.com/questions/168838/color-scaling-function
토마스 Pajonk

2
전원을 반전시키지 않아야합니까? 가정 빨간색은 최고 히트, 당신은 0.1과 0.4의가 H 낮은 높은 전원 사이에 노력하고 있습니다
아드리안 Davel

OpenGL을 사용하고 있습니까? 삼각형의 점을 다른 색상으로 설정 한 다음 그 사이에 혼합 / 그라데이션하는 방법이 있습니다. 그래픽 카드로 작업을 수행하도록 요구하는 성능이 향상 될 수 있습니다. 또한 코드가 더 간단하고 적응력이 좋을 수 있습니다 (예를 들어 외계인 파워 미터를 녹색에서 파란색으로
바꾸려면

답변:


203

이것은 작동해야합니다-빨강 및 녹색 값을 선형으로 조정하십시오. 최대 빨강 / 녹색 / 파랑 값이 255이고 n범위 내에 있다고 가정0 .. 100

R = (255 * n) / 100
G = (255 * (100 - n)) / 100 
B = 0

(정수 수학, Ferrucio의 모자 팁 수정)

또 다른 방법은 HSV 색상 모델 을 사용하고 채도 및 값에 따라 색조를 0 degrees(적색)에서 120 degrees(녹색)으로 순환시키는 것입니다. 이것은 더 즐거운 그라디언트를 제공해야합니다.

다음은 각 기법의 데모입니다. 상단 그라디언트는 RGB를 사용하고 하단은 HSV를 사용합니다.

http://i38.tinypic.com/29o0q4k.jpg


20
HSV 공간 에서이 작업을 수행하는 것이 훨씬 좋습니다.
DJClayworth

@DJClayworth, 그래, 나는 HSV와 함께 갔다.
mmcdole

+1; HTML / PHP에서 막대 차트를 채색하는 데 필요한 색상 알고리즘을 개선하는 방법에 대한 새로운 질문을 할 것입니다 ...이 질문을 비슷하게 제안하면 귀하의 답변으로 질문하지 않고도 문제를 해결할 수 있습니다! 감사!
beggs

모든 색상 값에서 작동하는 함수를 어떻게 작성 하시겠습니까? RGB 20,30,190과 RBG 69,190,10 사이의 색상을 계산하십시오.
Kokodoko

1
같은 기술은 -, N 단계에서 값 Y에 값 X에서 각 단계를 이동하는 방법 (YX)에 의해 증가 X / N - 당신이 아니라 RGB보다 HSV 공간에서 이동하는 경우가 더 좋은 모양이지만
폴 딕슨

32

내 머리 꼭대기에서 HSV 공간의 녹색-빨강 색조 전환이 RGB로 변환되었습니다.

blue = 0.0
if 0<=power<0.5:        #first, green stays at 100%, red raises to 100%
    green = 1.0
    red = 2 * power
if 0.5<=power<=1:       #then red stays at 100%, green decays
    red = 1.0
    green = 1.0 - 2 * (power-0.5)

위의 예에서 빨강, 녹색, 파랑 값은 백분율이므로 가장 많이 사용되는 0-255 범위를 얻기 위해 255를 곱하는 것이 좋습니다.


12

Short Copy'n'Paste 답변 ...

Java Std에서 :

int getTrafficlightColor(double value){
    return java.awt.Color.HSBtoRGB((float)value/3f, 1f, 1f);
}

안드로이드 :

int getTrafficlightColor(double value){
    return android.graphics.Color.HSVToColor(new float[]{(float)value*120f,1f,1f});
}

참고 : 값은 빨강-녹색 조건을 나타내는 0과 1 사이의 숫자입니다.


직접 16 진수 색상 코드로 변환하려면, 당신은 레버리지 할 수 있습니다String.format("#%06X", 0xFFFFFF & getTrafficlightColor(value));
ngeek

10

허용 된 답변과 같은 녹색-노랑-빨강 표현을 원한다면 이것을보십시오.

http://jsfiddle.net/0awncw5u/2/

function percentToRGB(percent) {
    if (percent === 100) {
        percent = 99
    }
    var r, g, b;

    if (percent < 50) {
        // green to yellow
        r = Math.floor(255 * (percent / 50));
        g = 255;

    } else {
        // yellow to red
        r = 255;
        g = Math.floor(255 * ((50 - percent % 50) / 50));
    }
    b = 0;

    return "rgb(" + r + "," + g + "," + b + ")";
}


function render(i) {
    var item = "<li style='background-color:" + percentToRGB(i) + "'>" + i + "</li>";
    $("ul").append(item);
}

function repeat(fn, times) {
    for (var i = 0; i < times; i++) fn(i);
}


repeat(render, 100);
li {
    font-size:8px;
    height:10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<ul></ul>


이 코드를 사용하여 다른 백분율에 대해 동일한 값을 얻습니다 ... 아이디어? 예를 들어, 다음 백분율은 모두 RGB 1,255,0을 반환합니다. 0.277, 0.222, 0.111 ... 더 높은 값 (예 : 1.0)은 더 밝은 녹색으로 올바른 RGB를 반환하지만 임계 값 후에 후행을 멈추고 내 규모의 녹색 음영.
Patrick

8

녹색과 빨간색 사이의 선형 보간은 거의 작동해야합니다. 단, 중간에는 진흙 갈색이 있습니다.

가장 유연하고 가장보기 좋은 솔루션은 원하는 정확한 색상 램프가있는 이미지 파일을 어딘가에 배치하는 것입니다. 그런 다음 픽셀 값을 찾아보십시오. 그래디언트를 올바르게 조정할 수있는 유연성이 있습니다 .

여전히 코드에서 코드를 작성하려면 왼쪽의 녹색과 노란색 사이, 오른쪽의 노란색과 빨간색 사이를 보간하는 것이 가장 좋습니다. RGB 공간에서 녹색은 (R = 0, G = 255, B = 0), 노랑은 (R = 255, G = 255, B = 0), 빨강은 (R = 255, G = 0, B = 0) )-각 색상 구성 요소가 0에서 255로 가정합니다.


1
여기에서 스펙트럼을 빨강 / 노란색과 노랑 / 녹색으로 나누는 제안은 가장 즐거운 노랑 결과를 제공합니다.
fig

4

작은 함수로 백분율 값에 대한 RGB 정수 값을 제공합니다.

private int getGreenToRedGradientByValue(int currentValue, int maxValue)
{
    int r = ( (255 * currentValue) / maxValue );
    int g = ( 255 * (maxValue-currentValue) ) / maxValue;
    int b = 0;
    return ((r&0x0ff)<<16)|((g&0x0ff)<<8)|(b&0x0ff);
}

따라서 currentValue가 50이고 maxValue가 100 인 경우이 함수는 필요한 색상을 반환하므로이 함수를 백분율 값으로 반복하면 색상 값이 녹색에서 빨간색으로 바뀝니다. 나쁜 설명으로 죄송합니다


3

수락 된 답변은 실제로 질문에 대답하지 못했습니다 ...

C ++

다음은 세 가지 임의의 색상 사이를 선형적이고 효율적으로 보간하는 엔진의 간단한 C ++ 코드 세그먼트입니다.

const MATH::FLOAT4 color1(0.0f, 1.0f, 0.0f, 1.0f);  // Green
const MATH::FLOAT4 color2(1.0f, 1.0f, 0.0f, 1.0f);  // Yellow
const MATH::FLOAT4 color3(1.0f, 0.0f, 0.0f, 1.0f);  // Red

MATH::FLOAT4 get_interpolated_color(float interpolation_factor)
{
    const float factor_color1 = std::max(interpolation_factor - 0.5f, 0.0f);
    const float factor_color2 = 0.5f - fabs(0.5f - interpolation_factor);
    const float factor_color3 = std::max(0.5f - interpolation_factor, 0.0f);

    MATH::FLOAT4 color;

    color.x = (color1.x * factor_color1 +
               color2.x * factor_color2 +
               color3.x * factor_color3) * 2.0f;

    color.y = (color1.y * factor_color1 +
               color2.y * factor_color2 +
               color3.y * factor_color3) * 2.0f;

    color.z = (color1.z * factor_color1 +
               color2.z * factor_color2 +
               color3.z * factor_color3) * 2.0f;

    color.w = 1.0f;

    return(color);
}

interpolation_factor범위 내에있는 것으로 가정합니다 0.0 ... 1.0.
색상은 범위 0.0 ... 1.0(예 : OpenGL)에 있다고 가정합니다 .

씨#

C #으로 작성된 동일한 기능은 다음과 같습니다.

private readonly Color mColor1 = Color.FromArgb(255, 0, 255, 0);
private readonly Color mColor2 = Color.FromArgb(255, 255, 255, 0);
private readonly Color mColor3 = Color.FromArgb(255, 255, 0, 0);

private Color GetInterpolatedColor(double interpolationFactor)
{
    double interpolationFactor1 = Math.Max(interpolationFactor - 0.5, 0.0);
    double interpolationFactor2 = 0.5 - Math.Abs(0.5 - interpolationFactor);
    double interpolationFactor3 = Math.Max(0.5 - interpolationFactor, 0.0);

    return (Color.FromArgb(255,
                (byte)((mColor1.R * interpolationFactor1 +
                        mColor2.R * interpolationFactor2 +
                        mColor3.R * interpolationFactor3) * 2.0),

                (byte)((mColor1.G * interpolationFactor1 +
                        mColor2.G * interpolationFactor2 +
                        mColor3.G * interpolationFactor3) * 2.0),

                (byte)((mColor1.B * interpolationFactor1 +
                        mColor2.B * interpolationFactor2 +
                        mColor3.B * interpolationFactor3) * 2.0)));
}

interpolationFactor범위 내에있는 것으로 가정합니다 0.0 ... 1.0.
색상의 범위는 ~ 인 것으로 가정합니다 0 ... 255.


1
C # 코드 나 (upvote에 추가)에 대한 훌륭한 일을하지만 interpolationFactorColor2가 interpolationFactor2해야 거기에 맞춤법 실수가
DJIDave

또한 완전성을 위해 RGB를 MVC razr view로 반환하는 함수를 사용했습니다. double n = actualValue / maxValue; //이 비율은 0-1 var color = GetInterpolatedColor (n); return string.Concat ( "#", colour.R.ToString ( "X"), colour.G.ToString ( "X"), colour.B.ToString ( "X"));
DJIDave

@DJIDave : 와우, 명백하고 어리석은 실수입니다. 나는 그것을 고쳤다. 감사!
Tara

2

색상 구성 요소 를 선형 보간 (LERP) 해야합니다 . 시작 값 v0 , 종료 값 v1 및 필요한 비율 (0.0과 1.0 사이의 정규화 된 부동 소수점)이 주어지면 일반적으로 수행되는 방법은 다음과 같습니다 .

v = v0 + ratio * (v1 - v0)

이것은 비율이 0.0 일 때 v0, 비율이 1.0 일 때 v1 및 다른 경우 사이의 모든 것을 제공합니다.

RGB 구성 요소에서 또는 HSV 또는 HLS와 같은 다른 색 구성표를 사용하여이 작업을 수행 할 수 있습니다. 후자는 두 가지 색상 인식에 더 잘 어울리는 색조 및 밝기 구성 요소에서 작동하기 때문에 시각적으로 더 즐겁습니다.


2

HSV 공간의 선분 (중앙에 약간 너무 밝은 노란색이 있음)과 RGB 공간의 선분 (중앙에 못생긴 갈색) 사이에 무언가를 원한다고 말하고 싶습니다. 나는 이것을 사용 power = 0하여 녹색 power = 50을 줄 것이고 약간 둔한 노란색 power = 100을 줄 것이고 빨간색을 줄 것입니다.

blue = 0;
green = 255 * sqrt( cos ( power * PI / 200 ));
red = 255 * sqrt( sin ( power * PI / 200 )); 

2

Swift 및 HSV 스케일을위한 복사 및 붙여 넣기 솔루션은 다음과 같습니다.

UIColor 초기화 프로그램은 [0, 1]에서 색조, 채도 및 밝기를 허용하므로 [0, 1]의 주어진 값에 대해 다음 을 갖습니다.

let hue:        CGFloat = value / 3
let saturation: CGFloat = 1 // Or choose any
let brightness: CGFloat = 1 // Or choose any
let alpha:      CGFloat = 1 // Or choose any

let color = UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha)

1
import java.awt.Color;

public class ColorUtils {

    public static Color interpolate(Color start, Color end, float p) {
        float[] startHSB = Color.RGBtoHSB(start.getRed(), start.getGreen(), start.getBlue(), null);
        float[] endHSB = Color.RGBtoHSB(end.getRed(), end.getGreen(), end.getBlue(), null);

        float brightness = (startHSB[2] + endHSB[2]) / 2;
        float saturation = (startHSB[1] + endHSB[1]) / 2;

        float hueMax = 0;
        float hueMin = 0;
        if (startHSB[0] > endHSB[0]) {
            hueMax = startHSB[0];
            hueMin = endHSB[0];
        } else {
            hueMin = startHSB[0];
            hueMax = endHSB[0];
        }

        float hue = ((hueMax - hueMin) * p) + hueMin;

        return Color.getHSBColor(hue, saturation, brightness);
    }
}

1

CSS (최소 버전 2.1)에서 이런 종류의 그라디언트 (실제로 반대로)가 필요한 경우 HSL도 사용할 수 있습니다.

AngularJs 템플릿에 있고 값이 0에서 1 사이의 숫자이고 요소 (배경 또는 텍스트 색상)의 스타일을 지정하려고한다고 가정합니다 ...

hsl({{ value * 120}}, 50%, 35%)

첫 번째 값 :도 (0 빨강, 120 녹색) 두 번째 값 : 채도 (50 %는 중립) 세 번째 값 : 밝기 (50 % 중립)

여기 좋은 기사

위키 백과에 대한 이론 여기


1

Objective-CSimucal 솔루션 의 버전은 다음과 같습니다 .

- (UIColor*) colorForCurrentLevel:(float)level
{
    double hue = level * 0.4; // Hue (note 0.4 = Green)
    double saturation = 0.9; // Saturation
    double brightness = 0.9; // Brightness

    return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1.0];
}

어디 수준 사이의 값이 될 것입니다 0.01.0.
이것이 누군가를 돕기를 바랍니다!


1

파이썬 2.7에서 :

import colorsys

def get_rgb_from_hue_spectrum(percent, start_hue, end_hue):
    # spectrum is red (0.0), orange, yellow, green, blue, indigo, violet (0.9)
    hue = percent * (end_hue - start_hue) + start_hue
    lightness = 0.5
    saturation = 1
    r, g, b = colorsys.hls_to_rgb(hue, lightness, saturation)
    return r * 255, g * 255, b * 255

# from green to red:
get_rgb_from_hue_spectrum(percent, 0.3, 0.0)

# or red to green:
get_rgb_from_hue_spectrum(percent, 0.0, 0.3)

물론 퍼센트입니다 value / max_value. 또는 스케일이 0에서 시작하지 않으면 (value - min_value) / (max_value - min_value).


1

자바 스크립트

막대 차트와 함께 Google 시각화를 사용하고 있으며 백분율을 기준으로 막대가 녹색에서 빨간색으로 표시되기를 원했습니다. 이것은 내가 찾은 깨끗하고 완벽하게 작동하는 것으로 판명되었습니다.

function getGreenToRed(percent){
    r = percent<50 ? 255 : Math.floor(255-(percent*2-100)*255/100);
    g = percent>50 ? 255 : Math.floor((percent*2)*255/100);
    return 'rgb('+r+','+g+',0)';
}

0.50이 아닌 50 %의 백분율이 50인지 확인하십시오 .


1

허용 된 답변을 (0,100) 범위의 전반과 후반으로 나누고 100을 최대 수준으로 대체하여 범위가 동적이 될 수 있도록 허용 된 답변을 업데이트했습니다. 결과는 HSV 모델과 동일하지만 여전히 RGB를 사용합니다. 핵심은 노란 색을 나타 내기 위해 중간에 (255,255,0)을 갖는 것입니다. 이 아이디어를 허용 된 답변과 다른 VBA 코드에 결합 했으므로 VBA에서 달성하고 Excel에서 사용하십시오. 이 논리가 다른 언어 / 응용 프로그램에서 도움이되고 사용될 수 있기를 바랍니다.

Sub UpdateConditionalFormatting(rng As Range)
    Dim cell As Range
    Dim max As Integer

    max = WorksheetFunction.max(rng)

    For Each cell In rng.Cells

    If cell.Value >= 0 And cell.Value < max / 2 Then
        cell.Interior.Color = RGB(255 * cell.Value / (max / 2), 255, 0)
    ElseIf cell.Value >= max / 2 And cell.Value <= max Then
        cell.Interior.Color = RGB(255, 255 * ((max) - cell.Value) / (max / 2), 0)
    End If

    Next cell
End Sub

건배, 파 블린


1

VB

Public Function GetPercentageColor( _
  ByVal iPercent As Long, Optional _
  ByVal bOpposit As Boolean) As Long
' 0->100% - Green->Yellow->Red
' bOpposit - Red->Yellow->Green

If bOpposit Then iPercent = (100 - iPercent)

Select Case iPercent
Case Is < 1: GetPercentageColor = 65280 ' RGB(0, 255, 0)
Case Is > 99: GetPercentageColor = 255  ' RGB(255, 0, 0)
Case Is < 50: GetPercentageColor = RGB(255 * iPercent / 50, 255, 0)
Case Else: GetPercentageColor = RGB(255, (255 * (100 - iPercent)) / 50, 0)
End Select

End Function

이것이 효과가있을 수 있지만, 설명을
해주시면

0

자체 포함 된 예

<html>
<head>
<script>
//--------------------------------------------------------------------------
function gradient(left, mid, right)
{
    var obj = {}

    var lt50 = {"r":(mid.r-left.r)/50.0,
                "g":(mid.g-left.g)/50.0,
                "b":(mid.b-left.b)/50.0}
    var gt50 = {"r":(right.r-mid.r)/50.0,
                "g":(right.g-mid.g)/50.0,
                "b":(right.b-mid.b)/50.0}

    obj.getColor = function(percent) {
        if (percent == 50.0) {
            return mid;
        }
        if (percent < 50.0) {
            return "rgb("+Math.floor(left.r+lt50.r*percent+0.5)+","+
                          Math.floor(left.g+lt50.g*percent+0.5)+","+
                          Math.floor(left.b+lt50.b*percent+0.5)+")";
        }
        var p2 = percent-50.0;
        return "rgb("+Math.floor(mid.r+gt50.r*p2+0.5)+","+
                      Math.floor(mid.g+gt50.g*p2+0.5)+","+
                      Math.floor(mid.b+gt50.b*p2+0.5)+")";
    }

    return obj;
}

//--------------------------------------------------------------------------
var g_gradient = gradient( {"r":255, "g":20, "b":20},  // Left is red
                           {"r":255, "g":255, "b":20}, // Middle is yellow
                           {"r":20, "g":255, "b":20} ); // right is green

//--------------------------------------------------------------------------
function updateColor()
{
    var percent = document.getElementById('idtext').value.length;
    var oscore = document.getElementById('idscore');

    if (percent > 100.0) {
        percent = 100.0;
    }
    if (percent < 0.0) {
        percent = 0.0;
    }
    var col = g_gradient.getColor(percent)
    oscore.style['background-color'] = col;
    oscore.innerHTML = percent + '%';
}

</script>
</head>
<body onLoad="updateColor()">
<input size='100' placeholder='type text here' id='idtext' type="text" oninput="updateColor()" />
<br />
<br />
<div id='idscore' style='text-align:center; width:200px; border-style:solid;
     border-color:black; border-width:1px; height:20px;'> </div>
</body>
</html>

0

빨간색에서 노란색으로 변한 다음 녹색으로 변경되면
0-100으로 변합니다.

-(UIColor*) redToGreenColorWithPosition:(int) value {

    double R, G;
    if (value > 50) {
        R = (255 * (100 - value)/ 50) ;
        G = 255;
    }else {
        R = 255;
        G = (255 * (value*2)) / 100;
    }

    return [UIColor colorWithRed:R/255.0f green:G/255.0f blue:0.0f alpha:1.0f];
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.