2014-11-02 117 views
0

我有一个绘制圆的函数。绘制正方形时的OpenGL圆弧半径问题

glBegin(GL_LINE_LOOP); 
for(int i = 0; i < 20; i++) 
{ 
    float theta = 2.0f * 3.1415926f * float(i)/float(20);//get the current angle 

    float rad_x = ratio*(radius * cosf(theta));//calculate the x component 
    float rad_y = radius * sinf(theta);//calculate the y component 

    glVertex2f(x + rad_x, y + rad_y);//output vertex 

} 
glEnd(); 

这工作丹迪。我将X,Y和半径值保存在我的对象中。

然而,当我试着画一个正方形用下面的函数调用:

newSquare(id, red, green, blue, x, (x + radius), y, (y + radius)); 

我获得下面的图片。

enter image description here

正如你看到的,广场是近一倍宽(看起来更像直径)。以下代码是我如何创建我的方形框。正如你所看到的,它开始于它应该在的圆圈的中心。并且应该延伸到圆的边缘。

glBegin(GL_QUADS); 
    glVertex2f(x2, y2); 
    glVertex2f(x2, y1); 
    glVertex2f(x1, y1); 
    glVertex2f(x1, y2); 
glEnd(); 

我似乎无法理解为什么这是!

+0

你的代码看起来正确(假设'ratio = 1')。构建圆时,您可能已经设置了一些错误的参数。显然,两个'radius'变量都不匹配。 – 2014-11-02 15:24:39

+0

我的比例实际上是父窗口的宽度/高度!我会调查。 – 2014-11-02 15:27:32

+1

哦,所以你做了一个手动投影。你应该把它留给投影矩阵。这确保所有对象都在同一个坐标系中。例如。你还没有x修正你的四边形。 – 2014-11-02 15:29:28

回答

1

如果您正在纠正某个对象的x位置,则必须为所有其他对象执行此操作。

但是,如果你继续这样做,你很快就会陷入困境。在你的情况下,只有对象的宽度被纠正,但不是他们的位置。您可以通过设置正交投影矩阵来解决所有问题,而且您不需要再次修正位置。例如。像这样:

glMatrixMode(GL_PROJECTION); //switch to projection matrix 
glOrtho(-ratio, ratio, -1, 1, -1, 1); 
glMatrixMode(GL_MODELVIEW); //switch back to model view 

其中

ratio = windo width/window height 

此构造一个坐标系,其中顶部边缘具有y=1,底部边缘y=-1和左,右两侧分别具有x=-ratiox=ratio