繁体   English   中英

c ++ 颜色之间的淡入淡出? (阿杜诺)

[英]c++ Fade between colors? (Arduino)

我目前有这两种颜色之间的褪色:

for(int i=0;i<nLEDs;i++){
    a = (255 / 100) * (incomingByte * sensitivity);
    r = (r * 7 + a + 7) / 8;
    g = (g * 7 + (255 - a) + 7) / 8;
    b = 0;

    FTLEDColour col = { r , g , b };
    led.setLED(i, col);
  }

但现在我试图让用户输入他们自己的颜色:

// > Colour fade, Start colour

int colFade1Red = 0;
int colFade1Green = 255;
int colFade1Blue = 0;

// > Colour fade, End colour

int colFade2Red = 255;
int colFade2Green = 0;
int colFade2Blue = 0;

int fadeAm = 7; // Fade speed

使用褪色代码:

void ColourFade(){
  for(int i=0;i<nLEDs;i++){

    r = ctest(colFade1Red, colFade2Red, r);
    g = ctest(colFade1Green, colFade2Green, g);
    b = ctest(colFade1Blue, colFade2Blue, b);

    FTLEDColour col = { r , g , b };
    led.setLED(i, col);
  }
}

int ctest(int col1, int col2, int cur){
   int temp = col1 - col2;
   if(temp < 0) { temp = -temp; } 

   int alp = (temp / 100) * (incomingByte * sensitivity);

   if(col1 < col2){
     return (cur * fadeAm + (col2 - alp) + fadeAm) / (fadeAm +1 );
   } else {
     return (cur * fadeAm + alp + fadeAm) / (fadeAm +1 );
   }
}

但这从第二个用户颜色开始并逐渐变为粉红色。 我如何正确地褪色?

“incomingByte”也是一个介于 0 和 100 之间的值,并且代码处于更新循环中。

颜色之间的平滑过渡最好在不同的颜色空间(恕我直言)中完成。

例如,要从亮红色过渡到亮绿色,您是要通过亮黄色(在色轮的边缘附近)还是通过 #808000(暗黄色)——这就是直线插值会给你的结果RGB 域。

为我的Moodlamp 应用程序完成此操作后,我使用了HSL色彩空间。 我指定了开始颜色和结束颜色,以及过渡要采取的一些步骤。 这使我能够计算在过渡中的每个点调整 H、S 和 L 的量。

只有在使用颜色时,我才转换回 RGB。

你可以在这里看到 javascript 代码(请记住这是我写的第一个 Javascript,所以如果它看起来不习惯,那可能就是原因!):

https://github.com/martinjthompson/MoodLamp/blob/master/app/assistants/lamp-assistant.js

不可能褪色为粉红色,因为您从红色开始并以绿色结束。

为了避免这种错误,我建议您编写面向对象的代码。

如果您不想编写类来处理 3D 向量,您可以使用Arduino Tinker 库

我为你写了这个例子:

#include <Vect3d.h>
#include <SerialLog.h>

Tinker::Vect3d<float> red(255,0,0);
Tinker::Vect3d<float> green(0,255,0);
Tinker::SerialLog serialLog;

void setup(){
  Serial.begin(9600);
  serialLog.display("Fade color example");  
  serialLog.endline();
}

void loop(){
  //fade factor computation
  const uint32_t t   = millis()%10000;
  const float cosArg = t/10000.*3.1415*2;
  const float fade   = abs(cos(cosArg));

  //Here's the color computation... as you can see is very easy to do!! :)
  Tinker::Vect3d<uint8_t> finalColor(red*fade + green*(1-fade));

  //We print the vect3d on the arduino serial port
  Tinker::LOG::displayVect3d(finalColor,&serialLog);
  serialLog.endline();
  delay(500);
}

在串口上打印以下输出

Fade color example
V[255;0;0]
V[242;12;0]
V[206;48;0]
V[149;105;0]
V[78;176;0]
V[0;254;0]
V[79;175;0]
V[150;104;0]
V[206;48;0]
V[242;12;0]
V[254;0;0]
V[242;12;0]
V[205;49;0]
V[148;106;0]
V[77;177;0]
V[1;253;0]
V[80;174;0]
V[151;103;0]

希望这会有所帮助:)

uint8_t clrR = abs(255 * cos(<some var that changes in time>));

clrB 和 clrG 相同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM