gpt4 book ai didi

c++ - OpenGl翻译

转载 作者:行者123 更新时间:2023-11-28 06:56:01 25 4
gpt4 key购买 nike

我试图在一个循环中将一个三角形转换为一个固定的四边形,但不知道为什么我的循环运行的条件比我为运行循环所应用的条件少一个。我无法理解的是,我已经给出了在循环内平移三角形的条件,但是在满足平移条件之后,如果循环还有更多的迭代但没有更多的平移条件满足,三角形就会回到它的位置原始位置,我期待其翻译位置的三角形。

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();
}
}

最佳答案

从评论中听起来好像您的代码可以正常工作,但我相信真正的问题出在别处,与 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;

一个不会导致您的问题但非常相关的小项目:您在代码中混合了 float 和 double 值。代码中的常量 0.10.8 是 double 值,而您的变量是 float 。如果混合使用 float 和 double,操作将以 double 形式执行。例如,如果您编写 tr += 0.1tr 将首先转换为 double ,然后以 double 加上 0.1,并将结果四舍五入为 float 。虽然没有直接损坏,但这是低效且浪费的。使用 float 操作时,通常使用浮点常量要好得多,在本例中为 0.1f0.8f

关于c++ - OpenGl翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23167431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com