2013-01-03 117 views
0

在我的程序中,我試圖從一開始就去開始顏色 - >結束顏色 - >開始顏色等等。從一種顏色到另一種顏色的插值

這個問題不是特定於任何語言,雖然我從我自己的框架代碼寫這個片段。

注:lerp modifies the colorgetLerped returns new value

startProgram(){ 
ofColor startColor; //set as 152,219,255 
ofColor endColor; //set as 132,152,184 
ofColor lerpedColor = startColor; 
float colorShift = 0.01f; 
} 

//內即每幀的連續燒我在程序的功能

if(lerpedColor == endColor){ 
      endColor.set(startColor); 
      startColor.set(lerpedColor); 
      lerpedColor.set(startColor); 
      cout<<"Swapping end color"<<"\n"; 
      cout<<"Start Color: "<<ofToString(startColor)<<"\n"; 
      cout<<"End Color: "<<ofToString(endColor)<<"\n"; 
      cout<<"Lerped Color: "<<ofToString(lerpedColor)<<"\n"; 
    } 

    lerpedColor.lerp(endColor,colorShift); 
    cout<<"Lerped color"<<ofToString(lerpedColor)<<"\n"; 

從最初的起始色到結束我的色彩插值顏色發生的很好,但是這不會從最終顏色回到星星顏色回來。

if conditionlerpedColor == endColor當我得到以下COUTS被觸發一次:
startColor:132152184
ENDCOLOR:152219255
lerpedColor:132152184

什麼錯在這裏說的插值僅發生一次又不回來?

+0

Whak是一種「lerpedColors」嗎?考慮到沒有傳遞給你的lerp函數的startvalue,我認爲你的線性插值是不統一的。 –

+0

第一次後,'if condition'被觸發,lerpedColor始終爲(132,152,184),startColor始終爲(132,152,184)。請參閱我的文章的末尾 – user1240679

+1

很難說沒有看到lerp()函數的主體有什麼問題... –

回答

2

正確均勻線性內插可作爲實現:

int interp(int src, int dst, float time) { 
    return src*(1.0-time)+dst*time; 
} // where 0.0<=time<=1.0 

當有3種顏色在一次要被內插,一種可能性是取最大色差:

Color diff = abs(end - start); // diff.x = abs(end.x - start.x) etc. 
int steps = max(diff); 
int a=0; 
lerp(src, end, (float)a/(float)steps); 
a++; 
if (a==steps) { // swap start/end 
} 

在這種情況下,最大的色差將遞減/遞增1,而其他組件將被實際插值。

+0

哇!這是正確的。我再次檢查手動交換endColor和startColor,並在該框架中的「Lerp」不會改變顏色。射擊! – user1240679

+0

我試圖避免通過你的種類插值changin每個顏色值這麼多的手動工作。有沒有其他的方式可以通過使用現成的'lerp'功能在某處? – user1240679

+0

在C++中,您應該能夠使用具有運算符+, - 和標量*定義的矢量庫。你也很可能想要在我的第二個版本中實現整數步驟。 –

相關問題