添加鼠标事件以更改简单圆圈的颜色

adding mouse event to change the color of simple circle

我画了一个圆并尝试添加鼠标事件,这改变了圆的颜色我找不到好的资源

完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define window_width  1080  
#define window_height 720 
void drawFilledSun() {
    //static float angle;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0, 0, -10);
    int i, x, y;
    double radius = 0.30;
    //glColor3ub(253, 184, 19);     
    glColor3ub(255, 0, 0);
    double twicePi = 2.0 * 3.142;
    x = 0, y = 0;
    glBegin(GL_TRIANGLE_FAN); //BEGIN CIRCLE
    glVertex2f(x, y); // center of circle
    for (i = 0; i <= 20; i++) {
        glVertex2f(
            (x + (radius * cos(i * twicePi / 20))), (y + (radius * sin(i * twicePi / 20)))
        );
    }
    glEnd(); //END
}
void main_loop_function() {
    int c;
    drawFilledSun();
    glutSwapBuffers();
    c = getchar();
}
void GL_Setup(int width, int height) {
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glEnable(GL_DEPTH_TEST);
    gluPerspective(45, (float)width / height, .1, 100);
    glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitWindowSize(window_width, window_height);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutCreateWindow("GLUT Example!!!");
    glutIdleFunc(main_loop_function);
    GL_Setup(window_width, window_height);
    glutMainLoop();
}

GLFW提供了一些你需要的回调函数如glfwSetCursorPosCallback.

在这种情况下,您可以在绘图时通过 if 分支简单地检查它,main_loop_function 在您的代码中。剩下的工作大约是 C/C++,并且有很多路径可以到达它,例如 kbhit.

顺便说一句,使用多种命名风格并不优雅。

为太阳的红绿蓝颜色分量和颜色索引添加一个数组:

int color_i = 0;
GLubyte color[][3] = { {255, 0, 0 }, {253, 184, 19} };

使用颜色数组设置颜色属性

void drawFilledSun() {
     // [...]

     glColor3ubv(color[color_i]);

删除 main_loop_function 中的 getchar,它会阻止 window 响应。但是调用 glutPostRedisplay 持续更新 window:

void main_loop_function() {
    drawFilledSun();
    glutSwapBuffers();
    glutPostRedisplay();
}

使用glutDisplayFunc rather than glutIdleFunc and add a glutMouseFunc回调:

int main(int argc, char** argv) {
    // [...]

    glutDisplayFunc(main_loop_function);
    glutMouseFunc( mouseFunc );

在鼠标回调中更改颜色索引:

void mouseFunc(int button, int state, int x, int y)
{
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
        color_i = (color_i == 0) ? 1 : 0;
    }
}

看例子:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define window_width  1080  
#define window_height 720

int color_i = 0;
GLubyte color[][3] = { {255, 0, 0 }, {253, 184, 19} };

void drawFilledSun() {
    //static float angle;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0, 0, -10);
    int i, x, y;
    double radius = 0.30;
    glColor3ubv(color[color_i]);
    double twicePi = 2.0 * 3.142;
    x = 0, y = 0;
    glBegin(GL_TRIANGLE_FAN); //BEGIN CIRCLE
    glVertex2f(x, y); // center of circle
    for (i = 0; i <= 20; i++) {
        glVertex2f(
            (x + (radius * cos(i * twicePi / 20))), (y + (radius * sin(i * twicePi / 20)))
        );
    }
    glEnd(); //END
}

void main_loop_function() {
    drawFilledSun();
    glutSwapBuffers();
    glutPostRedisplay();
}

void GL_Setup(int width, int height) {
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glEnable(GL_DEPTH_TEST);
    gluPerspective(45, (float)width / height, .1, 100);
    glMatrixMode(GL_MODELVIEW);
}

void mouseFunc(int button, int state, int x, int y)
{
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
        color_i = (color_i == 0) ? 1 : 0;
    }
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitWindowSize(window_width, window_height);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutCreateWindow("GLUT Example!!!");
    glutDisplayFunc(main_loop_function);
    glutMouseFunc( mouseFunc );
    GL_Setup(window_width, window_height);
    glutMainLoop();
}