OpenGL交互式画圆教程:使用鼠标绘制圆形

本教程将引导你使用OpenGL编写一个简单的程序,该程序允许用户使用鼠标交互式地绘制圆形。

代码示例cpp#include <GL/glut.h>#include

// 圆参数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 mouseMove(int x, int y) { if (isDrawing) { 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; }

glutPostRedisplay();}

// 鼠标点击回调函数void mouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { 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();}

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);    glutPassiveMotionFunc(mouseMove);

glutMainLoop();

return 0;}

代码解释

  1. 初始化和设置: 代码首先包含必要的头文件,并定义了一些全局变量来存储圆的中心坐标 (centerX, centerY) 和半径 (radius),以及一个布尔变量 (isDrawing) 来指示用户是否正在绘制圆形。

  2. drawCircle() 函数: 此函数负责绘制圆形。它首先清除颜色缓冲区,然后检查半径是否大于 0。如果半径大于 0,则使用 GL_LINE_LOOP 模式绘制一个圆形。

  3. 鼠标交互: mouseMove()mouse() 函数处理鼠标事件。 - mouseMove() 函数在鼠标移动时更新圆心的坐标,但仅当 isDrawing 变量为 true 时才更新,这意味着用户正在拖动鼠标来确定圆心。 - mouse() 函数处理鼠标点击事件。当用户按下鼠标左键时,isDrawing 变量设置为 true,表示开始绘制圆形。当用户释放左键时,isDrawing 变量设置为 false,并根据鼠标释放的位置计算圆形的半径。

  4. 主函数: main() 函数初始化 GLUT 库,创建窗口,设置绘图模式,并注册回调函数。最后,它启动 GLUT 事件循环。

总结

这段代码展示了如何使用 OpenGL 和 GLUT 库创建简单的交互式图形程序。你可以根据自己的需要修改和扩展此代码,例如添加颜色选择、不同线宽或其他形状的绘制功能。


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

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