如何在opengl中实现圆填充算法?

时间:2011-04-13 14:21:20

标签: opengl

它的格式应为circle(float xcenter, float ycenter, float radius)

2 个答案:

答案 0 :(得分:7)

使用GL_TRIANGLE_FAN向下移动中心点,然后向下移动周边顶点:

void glCircle( float x, float y, float r, bool filled = true, unsigned int subdivs = 20 ) {
    if( filled ) {
        glBegin( GL_TRIANGLE_FAN );
        glVertex2f( x, y );
    } else {
        glBegin( GL_LINE_STRIP );
    }

    for( unsigned int i = 0; i <= subdivs; ++i ) {
        float angle = i * ((2.0f * 3.14159f) / subdivs);
        glVertex2f( x + r * cos(angle), y + r * sin(angle) );
    }

    glEnd();
}

答案 1 :(得分:2)

有一个gluDisk,但它的签名与你给出的略有不同。它始终将磁盘置于原点的中心,如果不是您想要的磁盘,则希望使用glTranslate。它在其他方面也有点多功能 - 它绘制的磁盘可能在中心有一个洞,你(显然)不关心,以及一个“循环”参数来绘制一个以上的磁盘时间。这使得它适应你所要求的工作量而不是你想要的工作:

void circle(float xcenter, float ycenter, float radius) {
    GLUquadric* quad = gluNewQuadric();

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    glTranslatef(xcenter, ycenter);

    gluDisk(quad, 0, radius, 256, 1);
    glPopMatrix();
    gluDeleteQuadric(quad);
}

我认为这是正确的,因为它可以更容易地像@genpfault那样说,并且自己画一个圆形的三角形扇形。