0

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

尽管我是从自己的框架代码中编写此代码段,但这个问题并不特定于任何语言。

注意: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";

我从初始开始颜色到结束颜色的颜色插值很好,但这不会从结束颜色返回到星颜色返回。

当我得到以下 couts 时, if conditionforlerpedColor == endColor只被触发一次:
startColor: 132,152,184
endColor: 152,219,255
lerpedColor: 132,152,184

这里出了什么问题,插值只发生一次而不是回来?

4

1 回答 1

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 
}

在这种情况下,最大的色差将减少/增加一个,而其他分量将被实际插值。

于 2013-01-03T08:13:57.990 回答