1

所以,我正在为 opengl 做一个小代码,它选择一个正方形的颜色并在他的值上求和 0.01,所以颜色会更闪亮。我有一个数组中每个正方形的颜色值,并且我得到一个变量,它保存颜色的最大一个元素的值,在这种情况下,这个值为一。这是功能的一部分

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

直接比较双打是个坏主意。您可以使用 >= 而不是 == 或执行类似的操作

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

其中 delta 是您要使用的精度。

您的问题是 - 双打永远不会完全按照您的预期存储。远远超出逗号分隔部分的数字末尾总是有波动。

于 2012-12-17T07:15:12.710 回答