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