在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
颜色值。
答
所以基本上你是说如果你的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;
}
这工作。谢谢! – ddominnik