利用键盘实现橡皮筋技术
键盘输入注册函数:glutKeyboardFunc(Key);它指定了程序在运行状态时,按下键盘上的任意一个键都会调用Ker函数:
void Key(unsigned char key,int x,int ,y);参数key的取值是一个字符值或对应的ASCLL编码,而(x,y)则是按下键盘时窗口中当前屏幕光标相对于
窗口左上角的位置坐标。
代码如下:
#include"gl/glut.h" int ipointnum=0;//已确定点的数目 int x1=0,x2=0,y1=0,y2=0;//确定的点坐标 int winWidth=400,winHeight=300;//窗口的宽度和高度 void Initial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口的背景颜色 } void ChangeSize(int w,int h) { winWidth=w;winHeight=h;//保存当前窗口的大小 glViewport(0,0,w,h);//指定窗口显示区域 glMatrixMode(GL_PROJECTION);//指定设置投影参数 glLoadIdentity();//调用单位矩阵,去掉以前的投影参数设置 gluOrtho2D(0.0,winWidth,0.0,winHeight);//设置投影参数 } void Display(void) { glClear(GL_COLOR_BUFFER_BIT);//用当前背景色填充窗口 glColor3f(1.0f,0.0f,0.0f);//指定当前的绘图颜色 if(ipointnum>=1) { glBegin(GL_LINES);//绘制直线段 glVertex2i(x1,y1); glVertex2i(x2,y2); glEnd(); } glutSwapBuffers();//交换缓冲区 } void Key(unsigned char key,int x,int y) { switch(key) { case 'p': if(ipointnum==0||ipointnum==2) { ipointnum=1; x1=x;y1=winHeight-y;//确定直线段的第一个端点 } else { ipointnum=2; x2=x;y2=winHeight-y;//确定直线段的第二个端点 glutPostRedisplay();//指定窗口重新绘制 } break; default:break; } } void PassiveMouseMove(GLint xMouse,GLint yMouse) { if(ipointnum==1) { x2=xMouse; y2=winHeight-yMouse;//将当前鼠标位置指定为直线的未固定端点 glutPostRedisplay(); } } int main(int argc,char *argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//使用双缓存及RGB模型 glutInitWindowSize(400,300);//指定窗口的大小 glutInitWindowPosition(100,100);//指定窗口在屏幕上的位置 glutCreateWindow("橡皮筋技术"); glutDisplayFunc(Display); glutReshapeFunc(ChangeSize);//指定窗口再整形回调函数 glutKeyboardFunc(Key);//指定键盘响应函数 glutPassiveMotionFunc(PassiveMouseMove);//指定鼠标移动响应函数 Initial(); glutMainLoop();//启动主GLUT时间处理循环 return 0; }