GLfloats之间的比较

时间:2012-12-17 02:04:43

标签: c++ opengl types

所以,我正在为opengl做一些代码,它选择一个正方形的颜色,并在其值上加0.01,所以颜色会更闪亮。我有一个数组中每个方块的颜色值,我得到一个变量,它保存颜色的最大一个元素的值可以去,在这种情况下,这个值是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()测量大小,颜色声明和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;

两者都属于同一个类,但颜色是静态的。 希望有人知道这个问题。

1 个答案:

答案 0 :(得分:1)

直接比较双打是一个坏主意。您可以使用&gt; =代替==或执行类似

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

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

你的问题是 - 双打永远不会像你期望的那样完全存储。数字末尾的波动总是远远超出逗号分隔部分。