在C++中可视化从红色到蓝色的RGB渐变

问题描述:

我有一个介于0和1之间的值,我试图确定用于表示值大小的颜色值。值越高,应该是“蓝色”越多,值越低,应该是越红,中间是绿色。所以RGB中的浮点值1应该是(0,0,255),RGB中的值0应该是(255,0,0),中间是(0,255,0)。我试图实现它,但在我的实现中,最高值是白色,最低值是黑色,这不是我想要实现的。在C++中可视化从红色到蓝色的RGB渐变

有谁知道如何实现这个?

我的尝试是:

unsigned int rgb[] = {0,0,0}; 
//16581375 = 255^3 
unsigned long colorValue = floatBetweenZeroAndOne * 16581375; 
rgb[0] = colorValue %255; 
rgb[1] = (colorValue/255) % 255; 
rgb[2] = ((colorValue/255)/255) % 255; 

尝试这种情况:

unsigned int rgb[] = { 0,0,0 }; 
float floatBetweenZeroAndOne = 0.25f; 

if (floatBetweenZeroAndOne <= 0.5f) 
{ 
    floatBetweenZeroAndOne *= 2.0f; 
    rgb[0] = (unsigned int)(255 * (1.0f - floatBetweenZeroAndOne) + 0.5f); 
    rgb[1] = (unsigned int)(255 * (floatBetweenZeroAndOne) + 0.5f); 
} 
else 
{ 
    floatBetweenZeroAndOne = floatBetweenZeroAndOne * 2.0f - 1.0f; 
    rgb[1] = (unsigned int)(255 * (1.0f - floatBetweenZeroAndOne) + 0.5f); 
    rgb[2] = (unsigned int)(255 * (floatBetweenZeroAndOne) + 0.5f); 
} 

它将平滑内插R G B分量之间的float颜色值。

+0

这工作。谢谢! – ddominnik

所以基本上你是说如果你的float变量是0,rgb [0]应该是0,如果你的变量是1,它应该是255。你的float变量* 255应该为红色做诀窍。让我们从现在开始调用你的浮点变量floatValue。

现在我们来做蓝色。这基本上与红色相反。我们希望floatValue为0时bluecolor为255,floatValue为1时为0。您可以像这样使用它:rgb [2] = 255 - floatValue * 255。

绿色的是最棘手的,我猜。我们希望该值上升如果0 < floatValue < 0.5并降低0.5当< floatValue < 1.我认为if语句可以做到这一点。

总的来说,我会这样编码。我没有测试过它。

unsigned float floatValue = 0.236; // Completely random number between zero and one. 
unsigned int rgb[] = {0,0,0}; 
rgb[0] = floatValue * 255; 
rgb[2] = 255 - floatValue * 255; 
if (floatValue > 0 && <= 0.5) 
{ 
    rgb[1] = floatValue * 512 // Since I guess you want it to be maxed out at 128. 
} 
else if (floatValue > 0.5 && floatValue <= 1) 
{ 
    rgb[1] = 255 - (floatValue - 0.5)*512; 
} 
else 
{ 
    cout << "floatValue has a value smaller than 0 or bigger than 1!"; 
    return -1; 
} 

这样的功能应该做的工作

void setColor(double value, int* rgb){ 
    if(value > 1 || value < 0) return; 
    if(value > 0.5){ 
     value -= 0.5; 
     rgb[0] = 0; 
     rgb[1] = (int)((1-2*value)*255); 
     rgb[2] = (int)(2*value*255); 
    } 
    if(value <= 0.5){ 
     rgb[0] = (int)((1-2*value)*255); 
     rgb[1] = (int)(2*value*255); 
     rgb[2] = 0; 
    } 
} 

您也可以尝试这个版本:

void rgbscalar(float scalar) 
{ 
    float ratio = 2 * scalar; 
    int r = 255 * (ratio - 1); 
    if (r < 0) r = 0; 

    int b = 255 * (1 - ratio); 
    if (b < 0) b = 0; 

    int g = 255 - b - r; 
    if (g < 0) g = 0; 

    std::cout << r << " " << g << " " << b << " : " << scalar << std::endl; 
}