2013-12-09 37 views
0

我現在有這個那2種顏色之間褪色:C++淡入顏色? (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之間的值,並且所述代碼是在更新循環。顏色之間

+0

方面'溫度/ 100'無線可能會返回0或1(這是一個整數除法)。你所有的'ctest'都很混亂,如果你指定了輸入,輸出和所需的轉換,那將會更容易。 –

回答

0

平滑過渡在不同的顏色空間(IMHO)最好進行。

作爲一個例子,要從明亮的紅色轉變爲明亮的綠色,您是想通過明亮的黃色(在colour wheel的邊緣附近)或通過#808000(暗黃色) - 這是直線插值給你在RGB域。

做完這些我Moodlamp app,我用了HSL色彩空間。我指定了開始顏色和結束顏色,以及要進行轉換的多個步驟。這使我能夠計算在轉換中的每個點上H,S和L的調整量。

只有在使用的這一點,顏色才轉換回RGB。

您可以在這裏看到的JavaScript代碼(請記住這是第一個JavaScript我寫過,所以如果它似乎不地道,這可能是爲什麼!):

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

0

這是不可能的褪色爲粉紅色,因爲你從紅色開始,以綠色結束。

爲了避免這種錯誤,我建議你寫一個面向對象的代碼。

如果你不想寫的類來處理3D vectonr可以使用Arduino Tinker Library

我寫這個例子給你:

#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] 

希望這有助於:)

+0

如何從最終顏色中獲取RGB值,我需要提取它們以轉換爲「FTLEDColour」。 –

+0

您可以通過操作符[]訪問Vect3d。所以finalColor [0]是紅色通道,finalColor [1]是綠色,而finalColor [2]是藍色通道。 –