2010-11-20 84 views
11

我想创建一个12片饼,每片不同的颜色。色轮背后的数学是什么

几乎每一个色轮似乎都遵循相同的格式;例如:http://www.tigercolor.com/color-lab/color-theory/color-theory-intro.htm

但是,有什么算法来产生颜色? RGB(theta)背后的数学是什么?对此肯定有一些确定的科学,但谷歌没有给我任何线索。

+0

是不是只是'color(angle)= HSV(angle,1,1) '? – 2010-11-20 21:24:55

+0

好的...但是这背后的数学是什么? – 2010-11-20 21:30:12

+2

你看过http://stackoverflow.com/questions/180/function-for-creating-color-wheels上的答案吗? – 2010-11-20 22:20:05

回答

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

请考虑upvoting /继StackExchange色彩理论网站:https://area51.stackexchange.com /建议/ 110687 /色彩理论 – 2017-06-22 08:14:39

7

色轮(例如Mac OS X的颜色选择器,下图)显示色调饱和(两个来自HSV colour space三种组分)。色调随着角度而变化,并且饱和度随着半径而变化。通常,(又名亮度)有一个单独的滑块。

Mac OS X colour picker

See Wikipedia如何来回转换HSV和RGB之间。或者可能有您的编程语言选择的API。例如,Python的colorsys library

1

如果你想有一个色轮喜欢你提供的例子(就像你在一个工艺品商店的油漆部分找到最色轮),其中红色是相对绿色和蓝色是相反的橙黄色,紫黄相反,等等,你可以简单地做下面的数学来修改HSL或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; 
}