用于红色到绿色渐变的算法

时间:2014-01-23 08:48:14

标签: algorithm

我需要一些数学算法来将值从#FF0000转换为#00FF00。

我不想通过黑色值。转换应从红色变为青色(浅蓝色),然后变为绿色。如果只需要从FF0000到000000再到00FF00,那将非常容易。

目标是让级别从0到1000,其中0是#FF0000,1000是#00FF00。 我只需要一些智能映射。

4 个答案:

答案 0 :(得分:3)

从评论中,我知道你希望能够显示红色和绿色之间的颜色,并且你不想“经历黑色”,我理解为“我想保持相同的强度”。

为此,您需要更改颜色空间。而不是RGB移动到HSL。取红色的HSL值,然后取绿色的HSL值,并在HSL空间中插值。

将所有中间值转换回RGB,并且您的红色到绿色范围。

答案 1 :(得分:3)

对于一般解决方案,Bart建议使用HSV空间是好的。 Pooya和Emilio的答案将在RGB空间中插入红色和绿色之间,在中间会产生深黄色/橄榄色。

如果您只需要红色和绿色之间的渐变,我建议采用以下快速解决方案:在上半部分中插入红色和黄色(#FFFF00),在下半部分插入黄色和绿色之间:

unsigned int red_green_interpol(double x)
{
    if (x <= 0.0) return 0xFF0000;
    if (x >= 1.0) return 0x00FF00;

    if (x < 0.5) {
        unsigned int g = 510 * x;

        return 0xFF0000 | g << 8;
    } else {
        unsigned int r = 510 * (1.0 - x);

        return 0x00FF00 | r << 16;
    }
}

我在0.0和1.0之间使用了一个双倍而不是从0到1000的整数范围,但是应该不难调整它。

答案 2 :(得分:0)

可能是这样的:

c:

void print_color ( int value )
{
    int r=(255*value)/1000;
    printf("#%02x%02x00",r,255-r)
}

编辑!

抱歉,我没有仔细阅读问题!

代表所有三种颜色:

C:

void print_color ( int value )
{
 int curr=(3*value)/1000;
 int color[3];

 color[curr%3]=(255* (value-curr*(1000/3)))/(1000/3);
 color[(curr+1)%3]=255-color[curr];
 color[(curr+2)%3]=0;

 printf("#%02x%02x%02x",color[0],color[1],color[2]);
 }

(可以为RGB订单更改索引......)

答案 3 :(得分:0)

已经回答了,但你想要一些简单的事情:

void gradient()
    {
    const int _a=3; // color components order
    const int _r=2;
    const int _g=1;
    const int _b=0;

    union _col  // color
        {
        DWORD dd;   // unsigned 32bit int (your color)
        BYTE db[4]; // 4 x BYTE
        } col;

    col.db[_r]=255; // start color 0x00FF0000
    col.db[_g]=  0;
    col.db[_b]=  0;
    col.db[_a]=  0;

    for (int i=0;i<255;i++) // gradient cycle (color 'intensity' = 255)
        {
        col.db[_r]--;
        col.db[_g]++;
        // here use your color col.dd;
        }
    }

对于水平情况,在这种情况下只有255个级别,所以删除并添加它(level = i 0..255):

    col.db[_r]=255-i;
    col.db[_g]=    i;
    col.db[_b]=    0;
    col.db[_a]=    0;