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 conditionforは、lerpedColor == endColor次のcoutを取得したときに1回だけ起動されます
。startColor:132,152,184
endColor:152,219,255
lerpedColor:132,152,184

ここで、からの補間が1回だけ発生し、元に戻らないという問題は何ですか?

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 つの色がある場合、1 つの可能性は最大色差を取ることです。

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 ずつ減少/増加し、他のコンポーネントは実際に補間されます。

于 2013-01-03T08:13:57.990 に答える