C OpenGL程序中返回零的数学函数
我已经知道你们中没有人能够复制这个bug,但我甚至不知道该尝试什么。代码如下:C OpenGL程序中返回零的数学函数,c,opengl,C,Opengl,我已经知道你们中没有人能够复制这个bug,但我甚至不知道该尝试什么。代码如下: void Arrow2D(double x, double y, double x2, double y2, double width) { double deltaX = x2 - x; double deltaY = y2 - y; double angle = atan2(deltaY, deltaX) * 180 / 3.14; double heightArrow = sqr
void Arrow2D(double x, double y, double x2, double y2, double width) {
double deltaX = x2 - x;
double deltaY = y2 - y;
double angle = atan2(deltaY, deltaX) * 180 / 3.14;
double heightArrow = sqrt(deltaX*deltaX + deltaY*deltaY);
printf("height = sqrt(%f) = %f\n", deltaX*deltaX + deltaY*deltaY, heightArrow);
/*glPushMatrix(GL_MODELVIEW);
glRotatef(angle, 0.0, 0.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
//glTranslatef(200, 200, 0);
glBegin(GL_QUADS);
glVertex2f(-width/2, 20);
glVertex2f(-width/2, 0);
glVertex2f(width/2, 0);
glVertex2f(width/2, 20);
glEnd();
glBegin(GL_TRIANGLES);
glVertex2f(-width/1.2, 20);
glVertex2f(+width/1.2, 20);
glVertex2f(0, 30);
glEnd();
glPopMatrix(GL_MODELVIEW);*/
}
现在,如果对第二部分进行了注释,则变量heightArrow
的值将正确打印。如果我取消注释注释注释代码,我只会得到以下打印:
height = sqrt(5000.000000) = 0.000000
基本上,我总是得到0作为输出(这与我用来计算角度的atan2函数的行为相同)。在GLUT
display
方法中调用的可视化函数之一中调用了Arrow2D
方法。您使用的编译器版本和优化选项是什么?您能为这两种情况下的函数发布编译器的汇编输出吗?(-S-masm=intel
选项用于GCC,-FAsc
用于MSVC)。您的GL实现可能会弄乱FPU的舍入控制字之类的东西。即使不是,也不应该将双精度浮点变量传递给glVertex2f(…)
,OpenGL有一组后缀为d
的双精度函数。使用单精度或使用适当的GL API调用。一个好的编译器应该警告你这样做。你真的在这段代码中包含了吗?我猜不会,因为否则编译器会警告您glPush/PopMatrix不接受任何参数。既然您提供了参数,我猜这会破坏堆栈或registers@HughFisher:删除此选项实际上解决了问题,谢谢@HughFisher你能把这个作为答案吗?它看起来对未来的游客很有用。