Как мне реализовать алгоритм заполнения круга в opengl? - PullRequest
2 голосов
/ 13 апреля 2011

Должно быть в форме circle(float xcenter, float ycenter, float radius).

Ответы [ 2 ]

7 голосов
/ 13 апреля 2011

Используя 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 голосов
/ 13 апреля 2011

Есть 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, и нарисовать круговой треугольник-веер самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...