Why isn't this a square? LWJGL

Viewed 567

I have a basic LWJGL window set up and I am trying to draw a square using the glBegin(GL_QUADS) method. Square square = new Square(25, 25, 25), is the way I am calling my Square class to draw the square... but it is a rectangle. When I call it I pass in all 25's as the parameters. the first two are the starting coordinates and the last 25 is the side length, as seen below. What am I doing wrong to produce a rectangle?

public Square(float x,float y,float sl) {
    GL11.glColor3f(0.5F, 0.0F, 0.7F);
    glBegin(GL11.GL_QUADS);
        glVertex2f(x, y);
        glVertex2f(x, y+sl);
        glVertex2f(x+sl, y+sl);
        glVertex2f(x+sl, y);
    glEnd();
}

My Viewport code

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity(); // Resets any previous projection matrices
    glOrtho(0, 640, 0, 480, 1, -1);
    glMatrixMode(GL_MODELVIEW);
2 Answers

To draw a square around the point (x | y) you can calculate the four points that represent the corners of your square.

First you'll need your width to height ratio

float ratio = width / height

I will use a defaultSize for the length of the shortest path from the midpoint to any of the sides.

Then you can calculate four values like so:

float a = x + defaultSize 
float b = ratio * (y + defaultSize) 
float c = x - defaultSize 
float d = ratio * (y - defaultSize)

with which you can represent all four corners to draw your square with. Since GL_SQUAD is deprecated I'll use GL_TRIANGLE.

glBegin(GL_TRIANGLES);
glColor3f(red, green, blue);

// upper left triangle
glVertex2f(a, b);
glVertex2f(c, b);
glVertex2f(c, d);

 // lower right triangle
glVertex2f(a, b);
glVertex2f(c, d);
glVertex2f(a, d);

glEnd();

I don't know if this is the most performant or idiomatic way to do this since I just started exploring LWJGL.

Related