Search code examples
c++openglfreeglutopengl-compat

How to draw a rhombus with freeglut?


I am trying to draw something like this image of the target output using OpenGL. I am using freeglut. I could draw three polygons, but I don't know how to give the three polygons right positioning. Below I attached the target output and my correct output.

The target output

My output

#include <GL/glut.h>

void init(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(-5.0, 5.0, -5.0, 5.0);
    glMatrixMode(GL_MODELVIEW);
}

void drawSquare(void)
{
    glBegin(GL_POLYGON);
    glVertex2f(0.0f, -1.0f);
    glVertex2f(2.0f, 0.0f);
    glVertex2f(0.0f, 1.0f);
    glVertex2f(-2.0f, 0.0f);
    glEnd();
}

void myDraw1(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    glColor3f(1.0, 0.0, 0.0);
    drawSquare();
    glTranslatef(2.0, 3.0, 0.0);
    glRotatef(30, 0.0, 0.0, 1.0);
    glColor3f(0.0, 1.0, 0.0);
    drawSquare();
    glLoadIdentity();
    glTranslatef(-2.0, -3.0, 0.0);
    glRotatef(-30, 0.0, 0.0, 1.0);
    glColor3f(0.0, 0.0, 1.0);
    drawSquare();
    glFlush();
}

void myDraw2(void)
{
    glClear(GL_COLOR_BUFFER_BIT);    
    glLoadIdentity();
    glColor3f(1.0, 0.0, 0.0);
    drawSquare();
    glPushMatrix();
    glTranslatef(2.0, 3.0, 0.0);
    glRotatef(30, 0.0, 0.0, 1.0);
    glColor3f(0.0, 1.0, 0.0);
    drawSquare();
    glPopMatrix();
    glTranslatef(-2.0, -3.0, 0.0);
    glRotatef(-30, 0.0, 0.0, 1.0);
    glColor3f(0.0, 0.0, 1.0);
    drawSquare();
    glFlush();
}

void main(int argc, char** argv)

{

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(600, 600);
    glutCreateWindow("Rotate");
    init();
    glutDisplayFunc(myDraw1);
    glutMainLoop();
}

Solution

  • The angle between the polygons is 120°. The center of the polygons is (0, 0). You have to rotate around the point (-2, 0). Translate the polygon in that way that that (-2, 0) is moved to (0, 0) and rotate the polygon:

    glRotatef(120.0, 0.0, 0.0, 1.0);
    glTranslatef(2.0, 0.0, 0.0);
    

    Note, operations like glTranslatef and glRotatef, specify a matrix and multiply the current matrix by the new specified matrix. Use glPushMatrix/glPopMatrix to save and restore the matrix (push on and pop from matrix stack).

    e.g:

    void myDraw1(void)
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glLoadIdentity();
    
        glColor3f(1.0, 0.0, 0.0);
        glPushMatrix();
        glRotatef(90.0, 0.0, 0.0, 1.0);
        glTranslatef(2.0, 0.0, 0.0);
        drawSquare();
        glPopMatrix();
    
        glColor3f(0.0, 1.0, 0.0);
        glPushMatrix();
        glRotatef(210.0, 0.0, 0.0, 1.0);
        glTranslatef(2.0, 0.0, 0.0);
        drawSquare();
        glPopMatrix();
    
        glColor3f(0.0, 0.0, 1.0);
        glPushMatrix();
        glRotatef(330.0, 0.0, 0.0, 1.0);
        glTranslatef(2.0, 0.0, 0.0);
        drawSquare();
        glPopMatrix();
    
        glFlush();
    }