Используя следующую функцию, которая рисует закрашенный круг в opengl, как мне сделать так, чтобы он отображался в разных координатах окна? - PullRequest
3 голосов
/ 16 ноября 2010

Привет, ребята. У меня есть следующий код для рисования закрашенного круга в opengl.Проблема в том, что он рисует в центре экрана.Как заставить его нарисовать в другой позиции?

Спасибо, и вот код:

#define CIRCLE_RADIUS = 0.15f

int circle_points = 100;

void draw()
{
    glClear(GL_COLOR_BUFFER_BIT);

    double angle = 2*  PI/circle_points ;
    glPolygonMode( GL_FRONT, GL_FILL );
    glColor3f(0.2, 0.5, 0.5 );

    glBegin(GL_POLYGON);

    double angle1 = 0.0;        
    glVertex2d( CIRCLE_RADIUS * cos(0.0) , CIRCLE_RADIUS * sin(0.0));

    int i;
    for (i = 0; i < circle_points; i++)
    {
        glVertex2d(CIRCLE_RADIUS * cos(angle1), CIRCLE_RADIUS *sin(angle1));
        angle1 += angle ;
    }

    glEnd();
    glFlush();
}

1 Ответ

3 голосов
/ 16 ноября 2010

Очевидным способом было бы сначала позвонить glTranslate.Обратите внимание, однако, что вы уже можете сделать то же самое немного проще с помощью комбинации glPointSize и glPoint:

glPointSize(CIRCLE_RADIUS/2.0f);
glPoint(center_x, center_y, center_z);

Прежде чем начать рисовать круги, вам понадобится что-то вроде:

glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);

В противном случае ваши "круги" могут закончиться квадратами.

Редактировать: Не зная, как вы установили свои координаты, невозможно узнать, что такое "верхний левый""позиция есть, но вы могли бы сделать что-то вроде этого:

void draw_circle(float x, float y, float radius) { 
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    glTranslatef(x, y, 0.0f);
    static const int circle_points = 100;
    static const float angle = 2.0f * 3.1416f / circle_points;

    // this code (mostly) copied from question:
    glBegin(GL_POLYGON);
    double angle1=0.0;
    glVertex2d(radius * cos(0.0) , radius * sin(0.0));
    int i;
    for (i=0; i<circle_points; i++)
    {       
        glVertex2d(radius * cos(angle1), radius *sin(angle1));
        angle1 += angle;
    }
    glEnd();
    glPopMatrix();
}

Затем вы могли бы позвонить (например):

draw_circle(0.0f, 0.0f, 0.2f); // centered
draw_circle(1.0f, 0.0f, 0.2f); // right of center
draw_circle(1.0f, 1.0f, 0.2f); // right and up from center

Конечно, указания, которые я дал, предполагают убежище(например) повернул ваш взгляд, поэтому x увеличивается вправо и y увеличивается вверх.

...