我正在尝试将一个三角形转换为循环中的固定四边形,并且不知道为什么我的循环运行的次数少于我用于运行循环的条件。而我无法理解的是,我已经给出了在循环中转换三角形的条件,但是在条件满足转换之后,如果循环还剩下一些迭代但没有更多的转换条件满足,则三角形回到它的原来的位置,我期待三角形到它的平移位置。
P.s:我必须申请多个对象但是我只申请三角形。
这是显示功能的代码。
void display(void){
float tr;
for (tr = 0.0; tr<=0.8; tr += 0.1)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
Thread::Sleep(100);
cout <<tr<<endl; // checking the loop variable values
glBegin(GL_QUADS); // making a fixed quad
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(-0.5f, 0.0f, 0.0f);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(0.5f, 0.0f, 0.0f);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(0.5f, -1.0f, 0.0f);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(-0.5f, -1.0f, 0.0f);
glEnd();
if (tr<=0.5) //condition to translate the triangle
glTranslatef(0.0,-tr, 0.0);
glBegin(GL_TRIANGLES); //Triangle to be translated
glColor3f(0.2f, 0.6f, 0.2f);
glVertex3f(-0.5f, 0.5f, 0.0f);
glColor3f(0.2f, 0.6f, 0.2f);
glVertex3f(0.5f, 0.5f, 0.0f);
glColor3f(0.2f, 0.6f, 0.2f);
glVertex3f(0.0f, 1.0f, 0.0f);
glEnd();
glPopMatrix();
glFlush();
}
}
答案 0 :(得分:1)
听起来就像你的代码一样有效,但我相信真正的问题出在其他地方,而且根本与OpenGL无关。它与浮点精度有关。问题在于这个循环:
for (tr = 0.0; tr<=0.8; tr += 0.1)
浮点值以二进制格式表示(大多数计算机上为IEE 754),精度有限。虽然0.1和0.8之类的值可以精确地以十进制浮点格式表示,但它们无法以计算机使用的二进制格式精确表示。这意味着在你的情况下,从0.0开始并添加0.1八次将不会导致0.8。我为你的循环打印出高精度的结果,它以0.80000007的值退出,比你预期的更早一次迭代,因为该值不再是<=近似值0.8。
执行您想要的操作的强大方法是使用如下所示的循环:
for (int i = 0; i <= 8; ++i)
{
float tr = i * 0.1f;
一个不会引起问题的小项目,但非常相关:您在代码中混合浮点值和双精度值。代码中的常量0.1
和0.8
是double值,而您的变量是float。如果混合float和double,则操作将以double形式执行。例如,如果您编写tr += 0.1
,tr
将首先转换为double,然后以双精度添加0.1,并将结果舍入为float。虽然没有直接损害,但这是低效和浪费的。使用浮点运算时,使用浮点常量通常要好得多,在这种情况下可以是0.1f
和0.8f
。