OpenGL + GLUT Не заполняет крайний левый многоугольник? - PullRequest
5 голосов
/ 29 июля 2011

Я сталкиваюсь со странной ошибкой OpenGL. OpenGL довольно нов для меня, но мы должны использовать его в моем классе искусственного интеллекта (потому что учитель действительно профессор графики).

В любом случае, это происходит: http://img818.imageshack.us/img818/422/reversiothello.png

Это происходит только с самым верхним, самым левым многоугольником. Другими словами, он находит самый дальний оставшийся многоугольник, а затем самый дальний и делает это с ним. (В настоящее время нет ничего, что стирало бы полигоны с доски).

Моя функция отображения такова:

void display_func(void)
{
    glClearColor(0.0, 0.45, 0.0, 1.0); // Background Color (Forest Green :3)
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);

    draw_board();

    glFlush();

    glutSwapBuffers();
};

Моя функция draw_board такая:

void draw_board()
{
    int size = 8;
    int stepX = WINDOW_XS / size;
    int stepY = WINDOW_YS / size;

    glColor3f(0.0,0.0,0.0); // line color black

    glBegin(GL_LINES);

    // Draw Columns
    for(int i = 0;i <= WINDOW_XS;i += stepX)
    {
        glVertex2i(i,0);
        glVertex2i(i, WINDOW_YS);
    }

    // Draw Rows
    for(int j = 0;j <= WINDOW_YS;j += stepY)
    {
        glVertex2i(0, j);
        glVertex2i(WINDOW_XS, j);
    }

    // Draw Circles
    for(int i = 0;i < 8;++i)
    {
        for(int j = 0;j < 8;++j)
        {
            if(engine->getOnBoard(i,j) == Reversi::PIECE_NONE) continue;
            if(engine->getOnBoard(i,j) == Reversi::PIECE_WHITE)
                glColor3f(1.0,1.0,1.0);
            if(engine->getOnBoard(i,j) == Reversi::PIECE_BLACK)
                glColor3f(0.0,0.0,0.0);

            int drawX = ((i+1)*64)-32;
            int drawY = 512-((j+1)*64)+32;
            gl_drawCircle(drawX,drawY,30);
        }
    }

    glEnd();
};

Моя функция мыши такова:

void mouse_func(int button, int state, int x, int y)
{
    if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN && x < WINDOW_XS)
    {    
        // row and column index
        x = (int)( x / (WINDOW_XS/8) );
        y = (int)( y / (WINDOW_YS/8) );

        std::cout << "Attempting to make a move at " << x << "," << y << std::endl;

        if(engine->makeMove(x,y))
        {
            glutPostRedisplay();
        }
    }
};

и моя функция gl_drawCircle такова:

void gl_drawCircle(float x, float y, float r)
{
    // http://stackoverflow.com/questions/5094992/c-drawing-a-2d-circle-in-opengl/5095188#5095188
    glBegin( GL_POLYGON );
    float t;
    int n;
    for(t = 0,n = 0; n <= 90; ++n, t = float(n)/90.f ) // increment by a fraction of the maximum 
    {
        glVertex2f( x + sin( t * 2 * PI ) * r, y + cos( t * 2 * PI ) * r );
    }
    glEnd();
}

Может кто-нибудь помочь мне?

Ответы [ 2 ]

6 голосов
/ 29 июля 2011

Единственная ошибка, на которую стоит ответить, - это то, что ваша функция draw_board не использует должным образом операторы glBegin и glEnd. Вы должны использовать оператор glEnd перед вызовом gl_drawCircle, иначе вы получите неприятное поведение.

Редактировать: ваш первый круг нарисован с использованием линий, потому что glBegin игнорируется (поскольку вы находитесь в контексте glBegin). Все остальные круги сделаны нормально, потому что вы делаете glEnd перед повторным вызовом glBegin. Первый нарисованный круг - самый левый, самый верхний круг.

3 голосов
/ 29 июля 2011

Вам нужно вызвать glEnd после рисования строк. Когда вы не вызываете glEnd, OpenGL игнорирует ваш вызов glBegin( GL_POLYGON ); и предполагает, что вы все еще хотите рисовать линии.

Так что просто добавив glEnd (); после рисования строк следует ее решить.

...