




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
苏州大学数学学院计算机图形学实验报告实验名称 人机交互程序设计(键盘、鼠标,菜单) 姓名 许志杰 学号 专业班级 09信计 实验日期 _2011_ 年 11 月 18 日 上课教师 _王平 实验成绩 _一、 实验的目的掌握人机交互方面的知识,并能熟练运用二、 实验的内容与步骤(可提供屏幕抓图)a. 完善书上的编辑多边形的程序增加菜单部分程序设计, 实现原来键盘控制的部分,和 图形颜色的控制。 b. 编程实现一个简单的画图程序 要求:(1)、能处理线段、多边形等几何对象。如果几何对象用顶点定义, 则程序允许用户交互输入顶点(2)、能处理像素(3)、能控制颜色、线型和填充图案等属性(4)、有控制程序运行的菜单(5)、当窗口移动或大小调整时不会出现异常现象。三、 实验结果与分析(可提供屏幕抓图) 颜色变化 四、 实验的使用说明和测试的数据当右击的时候会弹出菜单,选择菜单会执行相应的程序。五、 实验中的问题总结与心得体会代码的改变对于图像的改变影响不是很大,需较仔细的观察才能察觉。在点击的时候,反映不是很好,需要多点击几次才能出现变化,可能是程序上处理的不是很到位。六、 源代码清单:#include#include int width=400,height=600,vert1002,n=0, type=GL_LINE_STRIP,v;int rubberbanding=1,antialiasing=0;int i;void display(void) glClear(GL_COLOR_BUFFER_BIT);if(n=1 & (type=GL_LINE_STRIP|type=GL_LINE_LOOP)glBegin(GL_POINTS);glVertex2iv(vert0);glEnd();glBegin(type);for(i=0;in;i+) glVertex2iv(verti);glEnd();glutSwapBuffers();/*void keyboard(unsigned char key,int x,int y)switch(key)case a: antialiasing=!antialiasing;if(antialiasing) glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH);elseglDisable(GL_BLEND);glDisable(GL_LINE_SMOOTH);break;case c: n=0;break;case l: type=GL_LINE_STRIP; break;case p: type=GL_LINE_LOOP;break;case v:type=GL_POINTS;break;glutPostRedisplay();*/int findVertex(int x,int y)int dx,dy;for(i=0;in;i+)dx=verti0-x;dy=verti1-y;if(dx*dx+dy*dy14) return i;return -1;void mouse(int button,int state,int x,int y)switch(button)case GLUT_LEFT_BUTTON:if(state=GLUT_DOWN) v=n+;vertv0=x; vertv1=height-1-y; rubberbanding=1;glutPostRedisplay();else rubberbanding=0;break;case GLUT_RIGHT_BUTTON:if(state=GLUT_DOWN&(v=findVertex(x,height-1-y)!=-1)if(glutGetModifiers()=GLUT_ACTIVE_CTRL)for(i=v;in-1;i+)verti0=verti+10;verti1=verti+11;n-;else verti0=x;verti1=height-1-y;rubberbanding=1;glutPostRedisplay();else rubberbanding=1;break;void motion(int x,int y)if(rubberbanding)vertv0=x;vertv1=height-1-y; glutPostRedisplay();void menu(int item)switch(item)case 1: glColor3f(1,0,0);break;case 2: glColor3f(0,1,0);break;case 3: glColor3f(0,0,1);break;case 4: antialiasing=!antialiasing;if(antialiasing) glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH);elseglDisable(GL_BLEND);glDisable(GL_LINE_SMOOTH);break;case 5: n=0;break;case 6:type=GL_LINE_STRIP;break;case 7:type=GL_LINE_LOOP;break;case 8:type=GL_POINTS;break;glutPostRedisplay();void main(int argc, char *argv) glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);glutInitWindowPosition(50,100);glutInitWindowSize(width,height);glutCreateWindow(Edit Polygon);glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glColor3f(1,1,0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0,width,0,height);glutCreateMenu(menu);glutAddMenuEntry(red,1);glutAddMenuEntry(green,2);glutAddMenuEntry(blue,3);glutAddMenuEntry(启用或终止反走样,4);glutAddMenuEntry(清除显示域,5);glutAddMenuEntry(以折线方式显示,6);glutAddMenuEntry(以闭合折线方式显示,7);glutAddMenuEntry(仅显示定点,8);glutAttachMenu(GLUT_RIGHT_BUTTON);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);glutDisplayFunc(display);/glutKeyboardFunc(keyboard);glutMouseFunc(mouse);glutMotionFunc(motion);glutMainLoop();/* This program illustrates the use of the glut library forinterfacing with a window system */#define NULL 0#define LINE 1#define RECTANGLE 2#define TRIANGLE 3#define POINTS 4#define TEXT 5#include #include bool rubberbanding=false;void mouse(int, int, int, int);void key(unsigned char, int, int);void display(void);void drawSquare(int, int);void myReshape(GLsizei, GLsizei);void myinit(void);void screen_box(int, int, int);void right_menu(int);void middle_menu(int);void color_menu(int);void pixel_menu(int);void fill_menu(int);int pick(int, int);/* globals */GLsizei wh = 500, ww = 500; /* initial window size */GLfloat size = 3.0; /* half side length of square */int draw_mode = 0; /* drawing mode */int rx, ry; /*raster position*/GLfloat r = 1.0, g = 1.0, b = 1.0; /* drawing color */int fill = 0; /* fill flag */画点void drawSquare(int x, int y) y=wh-y; glColor3ub( (char) rand()%256, (char) rand()%256, (char) rand()%256); glBegin(GL_POLYGON); glVertex2f(x+size, y+size); glVertex2f(x-size, y+size); glVertex2f(x-size, y-size); glVertex2f(x+size, y-size); glEnd();/* rehaping routine called whenever window is resized or moved */void myReshape(GLsizei w, GLsizei h)/* adjust clipping box 调整剪裁盒*/ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* adjust viewport and clear 调整窗口和清晰的*/ glViewport(0,0,w,h); glClearColor (0.8, 0.8, 0.8, 1.0); glClear(GL_COLOR_BUFFER_BIT); display(); glFlush();/* set global size for use by drawing routine */ ww = w;/全局变量 wh = h; /void myinit(void)glViewport(0,0,ww,wh);/* Pick 2D clipping window to match size of X window This choice avoids having to scale object coordinateseach time window is resized */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, (GLdouble) ww , 0.0, (GLdouble) wh , -1.0, 1.0);/* set clear color to black and clear window */ glClearColor (0.8, 0.8, 0.8, 1.0); glClear(GL_COLOR_BUFFER_BIT); glFlush();void mouse(int btn, int state, int x, int y) static int count;/静态变量 int where; static int xp2,yp2; if(btn=GLUT_LEFT_BUTTON & state=GLUT_DOWN) glPushAttrib(GL_ALL_ATTRIB_BITS); where = pick(x,y); /glColor3f(1, 0, 0); if(where != 0) count = 0; draw_mode = where;/画的方式 else switch(draw_mode) case(LINE): if(count=0) count+; xp0 = x; yp0 = y; else glBegin(GL_LINES); glVertex2i(x,wh-y); glVertex2i(xp0,wh-yp0); glEnd(); /draw_mode=0; count=0; break; glutPostRedisplay(); case(RECTANGLE): if(count = 0) count+; xp0 = x; yp0 = y; else if(fill) glBegin(GL_POLYGON); else glBegin(GL_LINE_LOOP); glVertex2i(x,wh-y); glVertex2i(x,wh-yp0); glVertex2i(xp0,wh-yp0); glVertex2i(xp0,wh-y); glEnd(); /draw_mode=0; count=0; break;glutPostRedisplay(); case (TRIANGLE): switch(count) case(0): count+; xp0 = x; yp0 = y; break; case(1): count+; xp1 = x; yp1 = y; break; case(2): if(fill) glBegin(GL_POLYGON); else glBegin(GL_LINE_LOOP); glVertex2i(xp0,wh-yp0); glVertex2i(xp1,wh-yp1); glVertex2i(x,wh-y); glEnd(); /draw_mode=0; count=0; break; glutPostRedisplay(); case(POINTS): drawSquare(x,y); count+; break; glutPostRedisplay();case(TEXT): rx=x; ry=wh-y; glRasterPos2i(rx,ry); count=0; glPopAttrib(); glFlush(); /点击图标int pick(int x, int y) y = wh - y; if(y wh-ww/10) return 0; else if(x ww/10) return LINE;/1 else if(x ww/5) return RECTANGLE;/2 else if(x 3*ww/10) return TRIANGLE;/3 else if(x 2*ww/5) return POINTS;/4else if(x 1) size = size/2;void fill_menu(int id) if (id = 1) fill = 1; else fill = 0;void key(unsigned char k, int xx, int yy) if(draw_mode!=TEXT) return;glColor3f(0.0,0.0,0.0); glRasterPos2i(rx,ry); glutBitmapCharacter(GLUT_BITMAP_9_BY_15, k);/glutStrokeCharacter(GLUT_STROKE_ROMAN,i); rx+=glutBitmapWidth(GLUT_BITMAP_9_BY_15,k);/建立图标void display(void)int shift=0; glPushAttrib(GL_ALL_ATTRIB_BITS); glClearColor (0.8, 0.8, 0.8, 1.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); screen_box(0,wh-ww/10,ww/10); glColor3f(1.0, 0.0, 0.0); screen_box(ww/10,wh-ww/10,ww/10); glColor3f(0.0, 1.0, 0.0); screen_box(ww/5,wh-ww/10,ww/10); glColor3f(0.0, 0.0, 1.0); screen_box(3*ww/10,wh-ww/10,ww/10); glColor3f(1.0, 1.0, 0.0); screen_box(2*ww/5,wh-ww/10,ww/10); glColor3f(0.0, 0.0, 0.0);screen_box(ww/10+ww/40,wh-ww/10+ww/40,ww/20); glBegin(GL_LINES); glVertex2i(wh/40,wh-ww/20); glVertex2i(wh/40+ww/20,wh-ww/20); glEnd(); glBegin(GL_TRIANGLES); glVertex2i(ww/5+ww/40,wh-ww/10+ww/40); glVertex2i(ww/5+ww/20,wh-ww/40); glVertex2i(ww/5+3*ww/40,wh-ww/10+ww/40); glEnd(); glPointSize(3.0); glBegin(GL_POINTS); glVertex2i(3*ww/10+ww/20, wh-ww/20); glEnd();glRasterPos2i(2*ww/5,wh-ww/20);glutBitmapCharacter(GLUT_BITMAP_9_BY_15, A);shift=glutBitmapWidth(GLUT_BITMAP_9_BY_15, A);glRasterPos2i(2*ww/5+shift,wh-ww/20);glutBitmapCharacter(GLUT_BITMAP_9_BY_15, B);shift+=glutBitmapWidth(GLUT_BITMAP_9_BY_15, B);glRasterPos2i(2*ww/5+shift,wh-ww/20);glutBitmapCharacter(GLUT_BITMAP_9_BY_15, C); glFlush(); glPopAttrib();/*void motion(int x,int y)if(rubberbanding)vert0=x;vert1=500-1-y;glutPostRedisplay();*/int main(int argc, char* argv) int c_menu, p_menu, f_menu; glutInit(&argc,argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(500, 500); glutCreateWindow(square); glutDisplayFunc(display);/颜色菜单 c_menu = glutCreateMenu(color_menu); glutAddMenuEntry(Red,1); glut
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 留学那些事儿培训
- 2025年3D打印的仿生材料应用研究
- 2025行业消费行为分析模型
- 工商银行2025兴安盟秋招笔试性格测试题专练及答案
- 邮储银行2025河池市秋招笔试性格测试题专练及答案
- 邮储银行2025阜阳市秋招笔试性格测试题专练及答案
- 邮储银行2025四平市信息科技岗笔试题及答案
- 交通银行2025佳木斯市信息科技岗笔试题及答案
- 中国银行2025眉山市金融科技岗笔试题及答案
- 中国银行2025哈密市数据分析师笔试题及答案
- 个体诊所备案信息表
- 浅谈国内外深基坑支护技术的现状及进展
- 招标代理服务服务方案
- 小提琴培训行业市场前瞻与未来投资战略分析报告
- 网络舆情应对及处置
- (带目录)员工劳动合同书版Word模板下载
- 最高人民法院民法典婚姻家庭编司法解释
- 工业数据采集技术及应用 -配置能源采集仪表参数
- 《应急救援知识》课件
- 安全教育培训课件:机械设备维护和保养指南
- 【一例重症肺炎的个案护理案例报告6000字(论文)】
评论
0/150
提交评论