从一种颜色到另一种颜色的插值

Interpolation from one color to another and back

本文关键字:颜色 另一种 插值 一种      更新时间:2023-10-16

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

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

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

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

lerpedColor == endColorif condition只在我得到以下计数时被触发一次:
startColor: 132152184
endColor: 152219255
lerpedColor: 132152184

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

正确的均匀线性插值可以实现为:

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 
}

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