📜  程序在OpenGL中使用鼠标移动绘制圆

📅  最后修改于: 2021-04-17 14:34:22             🧑  作者: Mango

在本文中,任务是在OpenGL中单击鼠标即可绘制圆。

OpenGL: OpenGL是一种跨语言,跨平台的API,用于渲染2D和3D矢量图形。它将使用该工具进行大量的设计和动画制作。

  • 使用鼠标左键单击在控制台上的任何位置创建一个圆,创建的圆的中心的坐标取决于您单击的位置。
  • 要更改圆圈的颜色,只需右键单击鼠标。
  • 完成所有操作后,只需按键盘上的Esc键即可跳出程序。

方法:想法是使用以下内置函数在OpenGL中通过单击来绘制圆:

  • glMatrixMode(GL_PROJECTION):此函数将当前矩阵设置为投影。
  • glLoadIdentity():该函数用于将当前矩阵乘以单位矩阵。
  • gluOrtho2D(0.0,800.0,0.0,600.0):设置整个帧缓冲区的平行(正交)投影。
  • glutCreateWindow(“在单击鼠标时创建圆”):如上由用户指定创建窗口。
  • glClearColor(0,0,0,0):设置背景色。
  • glClear(GL_COLOR_BUFFER_BIT):清除帧缓冲区并设置glClearColor()函数调用中定义的值。
  • glutDisplayFunc(display):将显示事件与显示事件处理程序(display)链接在一起。
  • glutMouseFunc(mouse):鼠标事件处理程序。
  • glutKeyboardFunc(keyboard):键盘事件处理程序。
  • glutMainLoop():此函数循环当前事件。

以下是在OpenGL中实现onClick功能的C++程序:

C++
// C++ program to implement onClick
// functionality in OpenGL to draw
// a circle
#include 
#include 
#include 
#include 
#define xpix 500
#include 
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 degres
        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();
}


输出:

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。