如何在OpenGL C ++中只绘制1/4的圆圈

时间:2015-03-05 13:37:29

标签: opengl

我正在尝试仅绘制一个扇区/圆圈的一部分,但目前我总是得到一个完整的圆圈。

我用它画一个圆圈:

glColor3f (0.25, 1.0, 0.25);
GLfloat angle, raioX=0.3f, raioY=0.3f;
GLfloat circle_points = 100.0f;

glBegin(GL_LINE_LOOP);
for (int i = 0; i < circle_points; i++) {
    angle = 2*PI*i/circle_points;
    glVertex2f(0.5+cos(angle)*raioX, 0.5+sin(angle)*raioY);        
}
glEnd();

3 个答案:

答案 0 :(得分:4)

假设您想要following diagram

中所示的扇区

enter image description here

您需要以这种方式重新编写代码:

    glBegin    (GL_LINE_LOOP);
    glVertex2f (0.5f, 0.5f);
    for (int i = 0; i < circle_points; i++) {
        angle = 2*PI*i/circle_points;
        glVertex2f (0.5+cos(angle)*raioX, 0.5+sin(angle)*raioY);

    }
    glEnd ();

我唯一改变的是在圆圈的中心添加了点0.5,0.5。不管怎样,你最终会绘制一个段而不是一个扇区。


正如BDL指出的那样,您的原始代码画了一整圈。你1/4圈的角度应该是Pi / 2而不是2 * Pi。所以至少,你还需要重写这一行:

angle = PI * 0.5f * i / circle_points;

BDL的答案显示了一种更有效的方法。虽然它绘制弧线,可能是也可能不是你想要的。无论哪种方式,你现在都有足够的代码来绘制上图中的所有三件事。

答案 1 :(得分:3)

您经常使用cos()sin()调用每个点的代码是正确的,但效率非常低。这些是相当昂贵的功能,编写代码很容易,只需要一次。

这个想法是你通过以角度增量旋转来获得前一点的每个点。旋转本身可以通过2x2变换矩阵来执行。这将每个点的计算减少到几个加法和乘法。

代码看起来像这样:

// Calculate angle increment from point to point, and its cos/sin.
float angInc = 0.5f * PI / (circle_points - 1.0f);
float cosInc = cos(angInc);
float sinInc = sin(angInc);

// Start with vector (1.0f, 0.0f), ...
float xc = 1.0f;
float yc = 0.0f;

// ... and then rotate it by angInc for each point.
glBegin(GL_LINE_LOOP);
for (int i = 0; i < circle_points; i++) {
    glVertex2f(0.5f + xc, 0.5f + yc);        
    float xcNew = cosInc * xc - sinInc * yc;
    yc = sinInc * xc + cosInc * yc;
    xc = xcNew;
}
glEnd();

作为一个细微的细节,请注意,如果要绘制包含circle_points点的四分之一圆,包括起点和终点,则需要将角度范围除以circle_points - 1以获得角度增量。栅栏柱的数量和它们之间的间隙数量就是这个......

这将绘制一个圆弧段。 Andon已经详细阐述了细分市场和行业之间的差异。

上面的共享代码和我自己的答案:https://stackoverflow.com/a/25321141/3530129,它展示了如何使用现代OpenGL绘制圆圈。

答案 2 :(得分:2)

绘制圆的一小部分时,需要限制点的放置角度。 circle_points然后定义该圆弧应该分开多少个子部分。另外(正如@Andon M. Coleman指出的那样)使用GL_LINE_LOOP可能不是正确的选择,因为它总是会关闭从最后一点到第一点的线。

您的代码可能会以某种方式修改:

glColor3f (0.25, 1.0, 0.25);
GLfloat angle, raioX=0.3f, raioY=0.3f;
GLfloat circle_points = 100;
GLfloat circle_angle = PI / 2.0f;

glBegin(GL_LINE_STRIP);
for (int i = 0; i <= circle_points; i++) {
    GLfloat current_angle = circle_angle*i/circle_points;
    glVertex2f(0.5+cos(current_angle)*raioX, 0.5+sin(current_angle)*raioY);        
}
glEnd();