使用 OpenGL 编写交互式画圆程序

本示例代码使用 OpenGL 库实现了一个交互式画圆程序,用户可以使用鼠标进行交互,点击鼠标左键来确定圆的中心,然后拖动鼠标并松开左键来确定圆的半径。

#include <GL/glut.h>
#include <iostream>

// 圆参数
float centerX = 0.0f;
float centerY = 0.0f;
float radius = 0.0f;
bool isDrawing = false;

// 用于绘制圆
void drawCircle() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    if (radius > 0.0f) {
        glBegin(GL_LINE_LOOP);
        for (int i = 0; i < 360; i++) {
            float rad = i * 3.14159f / 180.0f;
            float x = centerX + radius * cos(rad);
            float y = centerY + radius * sin(rad);
            glVertex2f(x, y);
        }
        glEnd();
    }

    glFlush();
}

// 鼠标点击回调函数
void mouse(int button, int state, int x, int y) {
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
        centerX = (x - glutGet(GLUT_WINDOW_WIDTH) / 2) / (float)glutGet(GLUT_WINDOW_WIDTH) * 2.0f;
        centerY = -(y - glutGet(GLUT_WINDOW_HEIGHT) / 2) / (float)glutGet(GLUT_WINDOW_HEIGHT) * 2.0f;
        radius = 0.0f;
        isDrawing = true;
    }
    else if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
        float endX = (x - glutGet(GLUT_WINDOW_WIDTH) / 2) / (float)glutGet(GLUT_WINDOW_WIDTH) * 2.0f;
        float endY = -(y - glutGet(GLUT_WINDOW_HEIGHT) / 2) / (float)glutGet(GLUT_WINDOW_HEIGHT) * 2.0f;
        radius = sqrt(pow(endX - centerX, 2) + pow(endY - centerY, 2));
        isDrawing = false;
    }

    glutPostRedisplay();
}

// 鼠标拖动回调函数
void motion(int x, int y) {
    if (isDrawing) {
        float endX = (x - glutGet(GLUT_WINDOW_WIDTH) / 2) / (float)glutGet(GLUT_WINDOW_WIDTH) * 2.0f;
        float endY = -(y - glutGet(GLUT_WINDOW_HEIGHT) / 2) / (float)glutGet(GLUT_WINDOW_HEIGHT) * 2.0f;
        radius = sqrt(pow(endX - centerX, 2) + pow(endY - centerY, 2));
    }

    glutPostRedisplay();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutCreateWindow('Interactive Circle');

    glClearColor(0.0, 0.0, 0.0, 1.0);
    gluOrtho2D(-1.0, 1.0, -1.0, 1.0);

    glutDisplayFunc(drawCircle);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);

    glutMainLoop();

    return 0;
}

代码解释:

  1. 圆参数: centerX, centerY, radius 用于存储圆心坐标和半径。isDrawing 变量用于指示是否正在绘制圆形。
  2. drawCircle 函数: 该函数用于绘制圆形。它根据 centerX, centerY, radius 参数绘制一个圆形。
  3. 鼠标点击回调函数 mouse: 该函数处理鼠标点击事件。当用户点击鼠标左键时,程序会将点击位置作为圆心,并将 isDrawing 设置为 true 以指示开始绘制圆形。当用户松开鼠标左键时,程序会计算点击位置和圆心之间的距离作为圆的半径,并将 isDrawing 设置为 false 以指示停止绘制圆形。
  4. 鼠标拖动回调函数 motion: 该函数处理鼠标拖动事件。当 isDrawingtrue 时,程序会根据当前鼠标位置和圆心之间的距离实时更新圆的半径。

注意事项:

  • 此代码仅为演示目的,并未进行错误处理或优化。
  • 您需要安装 OpenGL 库并配置您的编译环境才能运行此代码。

扩展:

  • 可以添加更多的交互功能,例如使用键盘改变圆的颜色或大小。
  • 可以将圆的绘制方式修改为填充圆形而不是线框圆形。
  • 可以添加多个圆形,并实现它们之间的交互。

希望本示例代码对您有所帮助!

OpenGL 交互式画圆程序 - 使用鼠标绘制圆形

原文地址: https://www.cveoy.top/t/topic/bzQ8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录