OpenGL 鼠标交互画椭圆:实现用户交互式圆形绘制算法

本文提供了一个使用OpenGL库实现的用户交互式椭圆绘制算法的示例代码。用户可以通过鼠标点击和拖动来交互式地绘制椭圆,改变其位置和大小。

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

// 椭圆参数
float centerX = 0.0f;
float centerY = 0.0f;
float radiusX = 0.0f;
float radiusY = 0.0f;
bool isDrawing = false;

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

    if (radiusX > 0.0f && radiusY > 0.0f) {
        glBegin(GL_LINE_LOOP);
        for (int i = 0; i < 360; i++) {
            float rad = i * 3.14159f / 180.0f;
            float x = centerX + radiusX * cos(rad);
            float y = centerY + radiusY * 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;
        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;
        radiusX = fabs(endX - centerX);
        radiusY = fabs(endY - centerY);
        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;
        radiusX = fabs(endX - centerX);
        radiusY = fabs(endY - centerY);
    }

    glutPostRedisplay();
}

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

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

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

    glutMainLoop();

    return 0;
}

此代码使用OpenGL库实现了一个具有用户交互的椭圆生成算法。用户可以通过鼠标交互在屏幕上绘制椭圆。用户点击鼠标左键来确定椭圆的中心,然后拖动鼠标并松开左键来确定椭圆的半径。椭圆的位置和大小的改变会即时更新在屏幕上。

注意: 此代码仅为演示目的,并未进行错误处理或优化。您可以根据自己的需求进行修改和扩展。

希望对您有所帮助!

OpenGL 鼠标交互画椭圆:实现用户交互式圆形绘制算法

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

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