Program to draw circles using mouse moves in OpenGL - GeeksforGeeks

16 Jul, 2021
In this article, the task is to draw circles using a single mouse click in OpenGL.
OpenGL: OpenGL is a cross-language, cross-platform API for rendering 2D and 3D Vector Graphics. It will make a lot of design as well as animations using this.
Create a circle anywhere on the console using a single left mouse click and the coordinates of the center of the circle created depends on the position of your click.
To change the color of the circle, simply right-click on the mouse.
After performing all operations jump out of the program by simply pressing the Esc key on the keyboard.
Approach: The idea is to use the below inbuilt function to draw the circle using single click in OpenGL:
glMatrixMode(GL_PROJECTION): This function sets the current matrix to projection.
glLoadIdentity(): The function is used to multiply the current matrix by identity matrix.
gluOrtho2D(0.0, 800.0, 0.0, 600.0): It sets the parallel(orthographic) projection of the full frame buffer.
glutCreateWindow(“Circle Creation on mouse click”): Creates the window as specified by the user as above.
glClearColor(0, 0, 0, 0): It sets the background color.
glClear(GL_COLOR_BUFFER_BIT): It clears the frame buffer and set values defined in glClearColor() function call.
glutDisplayFunc(display): It links the display event with the display event handler(display).
glutMouseFunc(mouse): Mouse event handler.
glutKeyboardFunc(keyboard): Keyboard event handler.
glutMainLoop(): This function loops the current event.
Below is a C++ program that implements onClick functionality in OpenGL:
C++
// C++ program to implement onClick// functionality in OpenGL to draw// a circle#include <GL/glut.h>#include <iostream>#include <math.h>#include <stdlib.h>#define xpix 500#include <cstring>using namespace std; float r, g, b, x, y;bool flag = true;int counter = 0; // Function works on mouse clickvoid mouse(int button, int state,           int mousex, int mousey){    if (button == GLUT_LEFT_BUTTON        && state == GLUT_DOWN) {        flag = true;        x = mousex;        y = 600 - mousey;    }     // Change color of circle    else if (button == GLUT_RIGHT_BUTTON             && state == GLUT_DOWN) {        if (counter > 4) {            counter = 0;        }         counter++;         // Redisplay        glutPostRedisplay();    }} // Function that exits from programvoid keyboard(unsigned char key,              int x, int y){    switch (key) {    case 27:        glutHideWindow();    }} // Function to draw the circlevoid display(void){    float angle_theta;    if (counter == 1) {        glColor3f(1, 0, 0);    }    else if (counter == 2) {        glColor3f(0, 1, 0);    }    else if (counter == 3) {        glColor3f(0, 1, 1);    }    else if (counter == 4) {        glColor3f(0.5, 0, 1);    }    else if (counter == 5) {         glColor3f(0, 0.5, 1);    }     // Matrix mode    glMatrixMode(GL_PROJECTION);    glLoadIdentity();     // Given the coordinates    gluOrtho2D(0.0, 800.0,               0.0, 600.0);     // If the flag is true    if (flag) {         // Begin the pointer        glBegin(GL_POLYGON);         // Iterate through all the        // 360 degrees        for (int i = 0; i < 360; i++) {             // Find the angle            angle_theta = i * 3.142 / 180;            glVertex2f(x + 50 * cos(angle_theta),                       y + 50 * sin(angle_theta));        }         // Sets vertex        glEnd();    }     // Flushes the frame buffer    // to the screen    glFlush();} // Driver Codeint main(int argc, char** argv){     glutInit(&argc, argv);    glutInitWindowSize(800, 600);    glutInitWindowPosition(100, 100);    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);     // Creates the window as    // specified by the user    glutCreateWindow("Circle Creation "                     "on mouse click");     // Sets the background color    glClearColor(0, 0, 0, 0);     // Clears the frame buffer    glClear(GL_COLOR_BUFFER_BIT);     // Links display event with the    // display event handler(display)    glutDisplayFunc(display);     // Mouse event handler    glutMouseFunc(mouse);     // Keyboard event handler    glutKeyboardFunc(keyboard);     // Loops the current event    glutMainLoop();}
Output:  
 
akshaysingh98088
OpenGL
C++
C++ Programs
Geometric
Geometric
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Operator Overloading in C++
Polymorphism in C++
Friend class and function in C++
Sorting a vector in C++
std::string class in C++
Header files in C/C++ and its uses
Program to print ASCII Value of a character
How to return multiple values from a function in C or C++?
C++ Program for QuickSort
Sorting a Map by value in C++ STL