添加鼠标事件以更改简单圆圈的颜色[关闭]
Posted
技术标签:
【中文标题】添加鼠标事件以更改简单圆圈的颜色[关闭]【英文标题】:adding mouse event to change the color of simple circle [closed] 【发布时间】:2020-04-29 00:00:16 【问题描述】:我画了一个圆圈并尝试添加鼠标事件,这会改变圆圈的颜色我找不到好的来源
这是整个代码:
#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();
【问题讨论】:
这段代码有什么问题? 有什么问题?您是否在问如何编写鼠标按钮/运动回调?弄清楚你想问什么并将其编辑到问题中。 我可以用两种方式制作圆圈,这段代码正在工作我想添加添加鼠标事件的功能,改变圆圈的颜色我找不到方法 在问题中指定你想做什么。 我也有这个问题,如果你能帮助我感谢***.com/questions/61490759/simple-pallet-for-colors@genpfault 【参考方案1】:为太阳的红绿蓝颜色分量添加一个数组和一个颜色索引:
int color_i = 0;
GLubyte color[][3] = 255, 0, 0 , 253, 184, 19 ;
使用颜色数组设置颜色属性
void drawFilledSun()
// [...]
glColor3ubv(color[color_i]);
去掉main_loop_function
中的getchar
,它会阻止窗口响应。但请致电glutPostRedisplay
持续更新窗口:
void main_loop_function()
drawFilledSun();
glutSwapBuffers();
glutPostRedisplay();
使用glutDisplayFunc
而不是glutIdleFunc
并添加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();
【讨论】:
【参考方案2】:GLFW
提供了一些你需要的回调函数如glfwSetCursorPosCallback
。
在这种情况下,您可以在绘图时通过if
分支简单地检查它,main_loop_function
在您的代码中。剩下的工作是关于 C/C++ 的,有很多途径可以到达它,例如kbhit
。
顺便说一句,使用几种命名风格并不优雅。
【讨论】:
以上是关于添加鼠标事件以更改简单圆圈的颜色[关闭]的主要内容,如果未能解决你的问题,请参考以下文章