1

だから、私は 1 つの正方形の色を選択し、その値に 0.01 を合計する opengl の小さなコードを実行しているので、色はより輝きます。1 つの配列に各正方形の色の値があり、色の最大 1 つの要素の値を保持する 1 つの変数を取得しました。この場合、この値は 1 です。これは関数の一部です

for(GLint i = 0; i < 3; i++) {
      if(colors[selectedSquare][i] > 0) {
            colors[selectedSquare][i] += 0.01;
            if(colors[selectedSquare][i] == maxColor) {
                flag = false;
            }                
      }
 }

この関数を glutTimerFunc で呼び出し、毎回色の値を 0.01 ずつ改善します。色の値が 1 (maxColor) になると、関数の他の部分で色を減らし始めます。ここで問題になるのは比較

  (colors[selectedSquare][i] == maxColor)

真実になることはありません。チェックするためにいくつかの出力を作成しましたが、これが得られたものです

colors[selectedSquare][i] value = 0.99   size = 4
maxColor value = 1   size = 4
(colors[selectedSquare][i] == maxColor) is 0

colors[selectedSquare][i] value = 1   size = 4
maxColor value = 1   size = 4
(colors[selectedSquare][i] == maxColor) is 0

colors[selectedSquare][i] value = 1.01   size = 4
maxColor value = 1   size = 4
(colors[selectedSquare][i] == maxColor) is 0

colors[selectedSquare][i] value = 1.02   size = 4
maxColor value = 1   size = 4
(colors[selectedSquare][i] == maxColor) = 0

しかし興味深いのはここから始まります。比較を次のように変更すると、

((int)colors[selectedSquare][i] == maxColor)

私はこの出力を得る

colors[selectedSquare][i] value = 0.99   size = 4
maxColor value = 1   size = 4
(colors[selectedSquare][i] == maxColor) is 0

colors[selectedSquare][i] value = 1   size = 4
maxColor value = 1   size = 4
(colors[selectedSquare][i] == maxColor) is 0

colors[selectedSquare][i] value = 1.01   size = 4
maxColor value = 1   size = 4
(colors[selectedSquare][i] == maxColor) is 1

colors[selectedSquare][i] value = 1.02   size = 4
maxColor value = 1   size = 4
(colors[selectedSquare][i] == maxColor) is 1

sizeof()を使ってサイズを測っていて、colorsとmaxColorの宣言はこんな感じ

GLfloat (Memoria::colors)[9][3] = {
{ 0.80, 0.80, 0.00 },
{ 0.00, 0.80, 0.80 },
{ 0.80, 0.00, 0.00 },
{ 0.00, 0.80, 0.00 },
{ 0.00, 1.00, 1.00 },
{ 1.00, 0.00, 0.00 },
{ 1.00, 0.00, 1.00 },
{ 1.00, 1.00, 0.00 },
{ 1.00, 1.00, 1.00 },
};

const GLfloat maxColor;

どちらも同じクラスに属しますが、色は静的です。誰かが問題を知っていることを願っています。

4

1 に答える 1

1

double を直接比較するのは悪い考えです。== の代わりに >= を使用するか、次のようなことを行うことができます

if(fabs(colors[selectedSquare][i] - maxColor) > delta)

ここで、delta は使用する精度です。

あなたの問題は - double が期待どおりに正確に保存されることはありません。コンマで区切られた部分をはるかに超えた数字の末尾には常に変動があります。

于 2012-12-17T07:15:12.710 に答える