从一种颜色到另一种颜色的插值和背面

时间:2013-01-03 07:55:11

标签: c++ algorithm

在我的程序中,我试图从一开始就着色 - >结束颜色 - >开始颜色等等。

虽然我正在使用自己的框架代码编写此代码片段,但问题并非针对任何语言。

注意:lerp modifies the color getLerped 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 condition lerpedColor == endColor仅在我获得以下广告时被解雇一次:
startColor:132,152,184
endColor:152,219,255
lerpedColor:132,152,184

这里出现的问题是插值只发生一次而不是回来?

1 个答案:

答案 0 :(得分: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,其他组件将实际插值。