我想在一组已知值(例如温度值)上将蓝色变为深红色.我不知道如何动态计算蓝色到红色.
谁能帮我吗?
我从来没有参加算法课程,所以我认为这可能与这个问题有关.
如果您有更好的方法,请告诉我.
我在这里寻找某种代码.多谢你们.它可以是任何语言,但不可避免地会转换为C++.
一个简单的线性alpha混合函数可能如下所示:
float blend(float a, float b, float alpha)
{
return (1.f - alpha) * a + alpha * b;
}
Run Code Online (Sandbox Code Playgroud)
这会从插值a到b为alpha>从0到1.
如果您将其用于构成典型颜色值的每个红色,绿色和蓝色组件,您可以获得所需的效果:
struct Color
{
float r, g, b;
};
Color color_blend(const Color *a, const Color *b, float alpha)
{
struct Color x;
x.r = blend(a->r, b->r, alpha);
x.g = blend(a->g, b->g, alpha);
x.b = blend(a->b, b->b, alpha);
return x;
}
Run Code Online (Sandbox Code Playgroud)
为简洁起见,这有点C-ish; 随意重新制定和使用课程.
颜色通常指定为红色,绿色和蓝色光的数量.对于大多数用途,每种颜色分量(红色,绿色或蓝色)的8位分辨率就足够了.
所以你可能有这样的颜色结构:
typedef unsigned char uint8;
struct Colour
{
uint8 red;
uint8 green;
uint8 blue;
Colour(uint8 r, uint8 g, uint8 b) : red(r), green(g), blue(b) {}
};
Run Code Online (Sandbox Code Playgroud)
然后,一旦理解了RGB颜色模型,就可以制作颜色.对于您的示例颜色,这非常简单:
Colour Red(255, 0, 0);
Colour Blue(0, 0, 255);
Run Code Online (Sandbox Code Playgroud)
假设您想要在100步(或100秒或其他)上从蓝色变为红色.您只需将每个组件从源值增加到目标值,因此在您的情况下,蓝色到红色将是:
因此,当您移动到红色时,红色分量会逐渐变为全强度,而蓝色分量会逐渐淡化为零.
一些简单的代码来执行此操作:
// Fade from blue to red
Colour Source(0, 0, 255); // blue
Colour Target(255, 0, 0); // red
Colour MyColour = Source;
const int NumSteps = 100;
for (int i = 0; i <= NumSteps; i++)
{
MyColour.red = Source.red + (((Target.red - Source.red) * i) / NumSteps);
MyColour.green = Source.green + (((Target.green - Source.green) * i) / NumSteps);
MyColour.blue = Source.blue + (((Target.blue - Source.blue) * i) / NumSteps);
// Do something, like update the display
DoSomethingWithColour(MyColour);
}
Run Code Online (Sandbox Code Playgroud)
这会使MyColour从蓝色变为红色.请注意,这将淡出RGB色彩空间.
还有其他颜色空间,例如HLS和HSV,并且通过这些颜色空间的淡入将产生不同的效果.例如,在RGB颜色的上方,颜色将是RGB(128,0,128),这是紫色.如果淡入HSV空间,色调分量将从红色淡紫色变为蓝色,因此在这种情况下它是相同的.但是,如果选择不同的颜色,则可能会根据您使用的颜色空间获得不同的效果.
| 归档时间: |
|
| 查看次数: |
3211 次 |
| 最近记录: |