NPLS
NPLS

Reputation: 531

opengl Draw Oval not Circle

if I call the function DrawFilledCircleo() it makes an oval and not a circle , even if i put glBegin(GL_LINE_LOOP); it always makes Oval

void drawFilledCircle(GLfloat x, GLfloat y, GLfloat radius){
    int i;
    int triangleAmount = 20; //# of triangles used to draw circle

    //GLfloat radius = 0.8f; //radius
    GLfloat twicePi = 2.0f * PI;

    glBegin(GL_TRIANGLE_FAN);
        glVertex2f(x, y); // center of circle
        for(i = 0; i <= triangleAmount;i++) { 
            glVertex2f(
                    x + (radius * cos(i *  twicePi / triangleAmount)), 
                y + (radius * sin(i * twicePi / triangleAmount))
            );
        }
    glEnd();
}

i tried different functions for drawing circles but it always makes Oval .

i placed it in :

static void Draw(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glViewport(0, 0, widthX, heightY);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    texture[0] = SOIL_load_OGL_texture // load an image file directly as a new OpenGL texture
    (
        "img.jpg",
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
         SOIL_FLAG_INVERT_Y | SOIL_FLAG_COMPRESS_TO_DXT
    );
// allocate a texture name
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glBegin(GL_POLYGON);

    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  0.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  0.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  0.0f);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  0.0f);

    glEnd();

    drawFilledCircle(0.5f,0.5f,0.1f);

    glutSwapBuffers();
}

UPDATE :

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInit(&argc, argv);
    glutInitWindowSize(widthX, heightY);
    glutCreateWindow("earthQuake");
    glutReshapeFunc(resize);
    glutDisplayFunc(Draw);
    glutKeyboardFunc(keyPressed);
    glutKeyboardUpFunc(keyUp);
    /////////////////////////////////////
    glEnable(GL_TEXTURE_2D);
   // glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    //glClearDepth(1.0f);
    //glEnable(GL_DEPTH_TEST);
   // glDepthFunc(GL_LEQUAL);
   glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glutMainLoop();

widthX = 800; heightY = 400;

Upvotes: 1

Views: 4008

Answers (2)

Reto Koradi
Reto Koradi

Reputation: 54642

The previous answer showed one way of getting a circle, with the side effect of having to change your coordinates. I think this solution is generally more convenient, since you can still draw with the same coordinates you already had:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double aspectRatio = (double)width / (double)height;
glOrtho(-aspectRatio, aspectRatio, -1.0, 1.0, -1.0, 1.0);

Upvotes: 0

Łukasz Daniluk
Łukasz Daniluk

Reputation: 470

Most likely you have misaligned viewport and window size ratios.

Following answer might be helpful: https://stackoverflow.com/a/15725280/3301533

EDIT:

Thanks to this code:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

You have your oval. Try changing it to:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-widthX/2, width/X2, -heightY/2, heightY/2, -1, 1);

Upvotes: 1

Related Questions