在我的程序中,我试图从一开始就着色 - >结束颜色 - >开始颜色等等。
虽然我正在使用自己的框架代码编写此代码片段,但问题并非针对任何语言。
注意: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
这里出现的问题是插值只发生一次而不是回来?
答案 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,其他组件将实际插值。