使用C++动态地从蓝色增加到红色

Kri*_*hna 2 c++

我想在一组已知值(例如温度值)上将蓝色变为深红色.我不知道如何动态计算蓝色到红色.

谁能帮我吗?

我从来没有参加算法课程,所以我认为这可能与这个问题有关.

如果您有更好的方法,请告诉我.

我在这里寻找某种代码.多谢你们.它可以是任何语言,但不可避免地会转换为C++.

unw*_*ind 6

一个简单的线性alpha混合函数可能如下所示:

float blend(float a, float b, float alpha)
{
  return (1.f - alpha) * a + alpha * b;
}
Run Code Online (Sandbox Code Playgroud)

这会从插值abalpha>从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; 随意重新制定和使用课程.


Sla*_*ker 5

颜色通常指定为红色,绿色和蓝色光的数量.对于大多数用途,每种颜色分量(红色,绿色或蓝色)的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秒或其他)上从蓝色变为红色.您只需将每个组件从源值增加到目标值,因此在您的情况下,蓝色到红色将是:

  • 红色:0到255
  • 绿色:0到0
  • 蓝色:255到0

因此,当您移动到红色时,红色分量会逐渐变为全强度,而蓝色分量会逐渐淡化为零.

一些简单的代码来执行此操作:

// 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空间,色调分量将从红色淡紫色变为蓝色,因此在这种情况下它是相同的.但是,如果选择不同的颜色,则可能会根据您使用的颜色空间获得不同的效果.