2011-04-13 83 views

回答

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(); 
} 
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說的那樣,自己畫一個圓形的三角形扇。