Programa para dibujar círculos usando movimientos de mouse en OpenGL

En este artículo, la tarea es dibujar círculos con un solo clic del mouse en OpenGL.

OpenGL: OpenGL es una API multiplataforma y multilenguaje para renderizar gráficos vectoriales 2D y 3D . Hará mucho diseño y animaciones usando esto.

  • Cree un círculo en cualquier lugar de la consola con un solo clic con el botón izquierdo del mouse y las coordenadas del centro del círculo creado dependen de la posición de su clic.
  • Para cambiar el color del círculo, simplemente haga clic derecho en el mouse.
  • Después de realizar todas las operaciones, salga del programa simplemente presionando la tecla Esc en el teclado.

Enfoque: la idea es usar la función incorporada a continuación para dibujar el círculo con un solo clic en OpenGL:

  • glMatrixMode(GL_PROJECTION): Esta función establece la array actual en proyección.
  • glLoadIdentity(): La función se utiliza para multiplicar la array actual por la array identidad.
  • gluOrtho2D(0.0, 800.0, 0.0, 600.0): establece la proyección paralela (ortográfica) del búfer de cuadro completo.
  • glutCreateWindow («Creación de círculos con un clic del mouse»): crea la ventana según lo especificado por el usuario como se indicó anteriormente.
  • glClearColor(0, 0, 0, 0): Establece el color de fondo.
  • glClear(GL_COLOR_BUFFER_BIT): Borra el búfer de cuadros y establece los valores definidos en la llamada a la función glClearColor().
  • glutDisplayFunc (display): vincula el evento de visualización con el controlador de eventos de visualización (display).
  • glutMouseFunc(mouse): controlador de eventos del mouse.
  • glutKeyboardFunc (teclado): controlador de eventos de teclado.
  • glutMainLoop(): Esta función repite el evento actual.

A continuación se muestra un programa C++ que implementa la funcionalidad onClick en 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 click
void 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 program
void keyboard(unsigned char key,
              int x, int y)
{
    switch (key) {
    case 27:
        glutHideWindow();
    }
}
 
// Function to draw the circle
void 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 Code
int 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();
}

Producción: 
 

Publicación traducida automáticamente

Artículo escrito por patidarakshay999 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *