2010-11-20 2 views
11

각 슬라이스마다 다른 색으로 12 개의 슬라이스로 파이를 만들고 싶습니다.컬러 휠 뒤의 수학은 무엇입니까

거의 모든 색상환이 동일한 형식을 따르는 것으로 보입니다. 예 : http://www.tigercolor.com/color-lab/color-theory/color-theory-intro.htm.

그러나 색상 생성을위한 알고리즘은 무엇입니까? RGB (theta) 뒤에있는 수학은 무엇입니까? 분명히 이것에 대해 확립 된 과학이 있어야하지만 Google은 나에게 단서를주지 않습니다.

+0

'색상 (각도) = HSV (각도, 1, 1)이 아닌가요? '? –

+0

ok ... 그 뒤에있는 수학은 무엇입니까? –

+2

http://stackoverflow.com/questions/180/function-for-creating-color-wheels에서 답변을 살펴 보셨습니까? –

답변

6

http://www.easyrgb.com을 보면 많은 색상 변환 알고리즘이 있습니다. 다음은 RGB -> HSV입니다.

var_R = (R/255)      //RGB from 0 to 255 
var_G = (G/255) 
var_B = (B/255) 

var_Min = min(var_R, var_G, var_B) //Min. value of RGB 
var_Max = max(var_R, var_G, var_B) //Max. value of RGB 
del_Max = var_Max - var_Min    //Delta RGB value 

V = var_Max 

if (del_Max == 0)      //This is a gray, no chroma... 
{ 
    H = 0        //HSV results from 0 to 1 
    S = 0 
} 
else         //Chromatic data... 
{ 
    S = del_Max/var_Max 

    del_R = (((var_Max - var_R)/6) + (del_Max/2))/del_Max 
    del_G = (((var_Max - var_G)/6) + (del_Max/2))/del_Max 
    del_B = (((var_Max - var_B)/6) + (del_Max/2))/del_Max 

    if  (var_R == var_Max) H = del_B - del_G 
    else if (var_G == var_Max) H = (1/3) + del_R - del_B 
    else if (var_B == var_Max) H = (2/3) + del_G - del_R 

    if (H < 0) H += 1 
    if (H > 1) H -= 1 
} 
+0

StackExchange Color Theory 사이트 : https://area51.stackexchange.com을 upvoting/follow하십시오./proposals/110687/color-theory –

7

(예 : 맥 OS X 색상 선택기로서, 아래 그림 참조)은 컬러 휠 색조 및 채도합니다 (HSV colour space에서 세 개의 구성 요소)를 표시한다. 색상은 각도에 따라 다르며 채도는 반경에 따라 다릅니다. 일반적으로 값인 (별명 밝기)에 대한 별도의 슬라이더가 있습니다.

Mac OS X colour picker HSV와 RGB 사이에 앞뒤로 변환하는 방법에 대한

See Wikipedia

. 또는 프로그래밍 언어를 선택하기위한 API가있을 수 있습니다. 예를 들어, 파이썬은 colorsys library입니다.

1

제공 한 예와 같은 색상환을 원한다면 (그리고 공예품 페인트 섹션에서 찾을 수있는 대부분의 색상환과 유사), 빨간색은 녹색과 파란색의 반대쪽이 노란색 - 오렌지색, HSV 또는 HSV의 색조를 수정하여 레거시 색조를 얻으려면 다음 수학을 간단히 수행 할 수 있습니다.

double ToLegacyHue(double modernHue) { 
    modernHue = ((modernHue % 360) + 360) % 360; // normalize 360 > modernHue >= 0 
    double ret = 0; 
    if(modernHue < 60) { 
     ret = modernHue * 2; 
    } else if(modernHue < 120) { 
     ret = modernHue + 60; 
    } else { 
     ret = (modernHue - 120) * 0.75 + 180; 
    } 
    return ret; 
} 

double FromLegacyHue(double legacyHue) { 
    legacyHue = ((legacyHue % 360) + 360) % 360; // normalize 360 > legacyHue >= 0 
    double ret = 0; 
    if(legacyHue < 120) { 
     ret = legacyHue/2; 
    } else if(legacyHue < 180) { 
     ret = legacyHue - 60; 
    } else { 
     ret = (legacyHue - 180)/0.75 + 120; 
    } 
    return ret; 
}