OpenGL时钟,右键变颜色.doc_第1页
OpenGL时钟,右键变颜色.doc_第2页
OpenGL时钟,右键变颜色.doc_第3页
OpenGL时钟,右键变颜色.doc_第4页
OpenGL时钟,右键变颜色.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课题名称: 计算机图形学基础 学号: 姓名: 计算机图形学课程设计报告题目名称: 编程实现时钟运动 专 业 计算机科学与技术班 级 13-04学 号 姓 名 指导教师 2016 年 1 月 13 日-20-目录一、设计内容与要求11.1 设计题目11.2 设计内容11.3 设计目标1二、方案设计12.1 总体方案设计12.2 过程流程图2三、 详细设计33.1 程序设计原理及说明33.1.1 表盘圆利用Bresenham算法33.1.2 时针、分针和秒针的直线画法33.1.3 颜色的添加33.1.4 获取系统时间33.1.5小刻度及整点时间数字添加43.1.6改变颜色及恢复颜色43.2 程序主要源代码5四、程序运行说明184.1 程序运行结果分析184.2 程序运行结果图例18五、总结195.1 程序结构优缺分析195.2 程序改进方案与展望195.3 心得体会20六、参考资料:20一、设计内容与要求1.1 设计题目编程实现时钟运动1.2 设计内容 设计一个可以获取系统时间的简易时钟,通过程序编写时钟的表盘、时针、分针、秒针和整点数字。钟表的样式根据自己的喜好设计,看起来简洁大方,还应该美观。时钟设计的重点在于如何获取系统的时间,表针之间的逻辑关系,时钟的模拟运行以及颜色的改变与恢复。1.3 设计目标时钟几乎是每个人生活中必备的生活用品。时钟虽小确非常重要。一款良好的时钟可以给人们带来极大的便利。这次设计的目标是能够获取系统时间,简洁美观,能够清楚地实现时针,分针,以及秒针的辨识和运转。并且能够通过右键改变时针以及表盘的颜色。二、方案设计2.1 总体方案设计 编程实现时钟运动,通过使用OpenGL以及图形学Bresenham的算法画出表针和表盘,并添加刻度。使用 OpenGL颜色模型中的RGBA模式来给表盘等添加颜色来达到美观并用于区分表针,来完成表针的运动。然后通过添加函数来获取系统时间。并通过点击右键菜单实现时钟背景与时针颜色的转换。2.2 过程流程图开始制定方案 右键改变颜色时针分针秒针表盘设计获取系统时间颜色回复函数颜色改变函数定义颜色变量表针位置关系表针逻辑关系表针的颜色整点添加数字制定表盘形状添加表盘刻度获取最新时间时钟整体效果动画结束 3、 详细设计3.1 程序设计原理及说明 3.1.1 表盘圆利用Bresenham算法 Bresenham画圆算法适合于生成整圆,它使用8路对称法,只计算出9045的点,移动方向为+x,-y。设(Xi,Yi)是扫描到第i步时选定的坐标,下个被选定的可能是T或S。如图: P T S Bresenham画法1/8圆弧示例 3.1.2 时针、分针和秒针的直线画法 由于时针、分针和秒针是随时间运动着的,而且其中一端位于固定点在圆盘中心,所以,只要确定另一端的移动点便可画出。3.1.3 颜色的添加再根据OpenGL颜色模型定义当前颜色。设置当时钟运行时交换的菜单,运行程序时可变换时钟背景与时针的颜色。最后再设置一个恢复菜单恢复开始时表盘与指针的颜色。 3.1.4 获取系统时间 获取系统时间用到函数_strtime,它的功能为获取当前系统时间(不包括日期),函数以字符指针形式为返回。例如:#include#include#include void main()char Now_time30;printf(%s,_strtime(Now_time);getch();运行结果将打印出当前时间。3.1.5小刻度及整点时间数字添加在表盘上添加数字用到函数glutBitmapCharacter(font , character),它是glut工具函数,用于在glut窗口某位置显示字符。由于是glut内置函数,功能有所限制,只能显示英文字符,而且字体、大小都不能任意设置。3.1.6改变颜色及恢复颜色改变颜色的函数:voidchange();恢复颜色的函数:voidresume();3.2 程序主要源代码/用OpenGL绘制的时钟#include #include #include #include #include #include #include #define changecolor 1 #define resumecolor 2 #define quit 3 float br=0.0,bg=0.0,bb=0.0; /定义变量用来改变颜色int winheight=768,winwidth=600;int cx=415,cy=300,radius=220; /钟表位置的调整int hradius=140,mradius=190,sradius=210;/指针的长度float sangle,mangle,hangle;char timebuffer9;char a=SOCOOL;int second,miniter,hour;void dotclock(int cx,int cy,int radius);void clock(char *string);void hand(int cx,int cy,int r,float thleta);void look(int cx,int cy);void plotC(int x,int y);void Bresenham_Circle_Algorithm(int cx, int cy);void processMenuEvents(int option); void drawline(); void hand(int cx,int cy,int r,float thleta); void Bresenham_Circle(int x0,int y0,double radius); void CirPot(int x0,int y0,int x,int y); void drawother();void createGLUTMenus(); void init(void) glPixelStorei(GL_UNPACK_ALIGNMENT,1); glClearColor(1.0, 1.0, 1.0, 1.0); _strtime(timebuffer);void myidle() /:Sleep(1000); _strtime(timebuffer);/取系统时间到timebuffer数组中 for(int i=0;i9;i+) couttimebufferi;coutendl; hour=(int)timebuffer0-48)*10+(int)timebuffer1-48); miniter=(int)timebuffer3-48)*10+(int)timebuffer4-48); second=(int)timebuffer6-48)*10+(int)timebuffer7-48); couthour:miniter:secondendl; sangle=(float)(3.1415/2-(float)second*2*3.1415/60); /秒钟走的角度 mangle=(float)3.1415/2-(float)(miniter+(float)second/60)/60*2*3.1415; /分钟走的角度 hangle=(float)3.1415/2-(float)(hour+(float)(miniter+(float)second/60)/60)*2*3.1415/12; /时钟走的角度 couthangle:mangle:sangleendl; glutPostRedisplay();void hand(int cx,int cy,int r,float thleta) float harr6; harr0=cx+r*cos(thleta); harr1=cy+r*sin(thleta); /glLineWidth(2.0f); glBegin(GL_LINES); glVertex2f(harr0,harr1); glVertex2f(cx,cy); glEnd();void display(void) glClear(GL_COLOR_BUFFER_BIT); glPointSize(2.0); glColor3f(br, 1.0, 0.0);/SOCOOL颜色 glRasterPos2i(20, 20); clock(a); glColor3f(0.5, bg, 1.0);/钟表刻度颜色 dotclock(cx,cy,radius); Bresenham_Circle_Algorithm(cx,cy); glColor3f(br, 0.0, 1.0); glLineWidth(2.0f); hand(cx,cy,sradius,sangle);/秒针 glColor3f(br, 1.0, 0.0); glLineWidth(4.0f); hand(cx,cy,mradius,mangle);/分针 glColor3f(0.5, bg, 0.5); glLineWidth(6.0f); hand(cx,cy,hradius,hangle);/时针 glutSwapBuffers();void clock(char *string) int length; length = (int) strlen(string); glRasterPos2i(370,420);/调整“SOCOOL”的位置 /glColor3f(1.0,0.0,0.0); for (int m=0;mlength;m+) glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, stringm); void reshape(int w, int h) glViewport(0,0,(GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, (GLdouble)w,0.0,(GLdouble)h); glMatrixMode(GL_MODELVIEW);void keyboard(unsigned char key, int x, int y) switch (key) case 27: exit(0); void dotclock(int cx, int cy, int radius) int array132; int arr602; float angle,angle2; angle=2*3.1415/12;/时刻个数 angle2=2*3.1415/60; for(int j=0;j60;j+) arrj0=cx+radius*cos(j*angle2); arrj1=cy+radius*sin(j*angle2); glBegin(GL_POINTS); glPointSize(4.0); glVertex2f(arrj0,arrj1); glEnd(); for(int i=0;i12;i+) arrayi0=cx+radius*cos(i*angle); arrayi1=cy+radius*sin(i*angle); glPointSize(8.0); char a=i+1; glBegin(GL_POINTS); glVertex2f(arrayi0,arrayi1); glEnd(); glColor3f(0.0,0.0,0.0); glRasterPos2i(285+radius, 455); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I);/数字1 glRasterPos2i(352+radius, 390); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I);/数字2 glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I); glRasterPos2i(346+radius, 192); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I);/数字4 glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,V); glRasterPos2i(282+radius, 122); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,V);/数字5 glRasterPos2i(82+radius, 122); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,V);/数字7 glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I); glRasterPos2i(20+radius, 199); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,V);/数字8 glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I); glRasterPos2i(20+radius, 390); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,X);/数字10 glRasterPos2i(83+radius, 456); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,X);/数字11 glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I); glRasterPos2i(181+radius, 100); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,V);/数字6 glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I); glRasterPos2i(213, 72+radius); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I);/数字9 glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,X); glRasterPos2i(152+2*radius,72+radius); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I);/数字3 glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I); glRasterPos2i(174+radius,43+2*radius); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,X);/数字12 glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,I); /glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, 2); void plotC(int x,int y,int cx,int cy) glColor3f(0.0,bg,0.0);/钟表外框颜色 glBegin(GL_POINTS); glVertex2f(cx+x,cy+y);/画钟表外框 glVertex2f(cx+x,cy-y); glVertex2f(cx-x,cy+y); glVertex2f(cx-x,cy-y); glVertex2f(cx+y,cy+x); glVertex2f(cx+y,cy-x); glVertex2f(cx-y,cy+x); glVertex2f(cx-y,cy-x); glEnd();void Bresenham_Circle_Algorithm(int cx, int cy) int x,y,d; int bradius=240;/钟表外框的大小 y=bradius; d=3-2*bradius; x=0; while(x=y) plotC(x,y,cx,cy); if(d0) d+=4*x+6; else d+=4*(x-y)+10; y=y-1; x=x+1; void change() /改变颜色 br=1.0,bg=1.0,bb=1.0; void resume() /恢复颜色 br=0.0,bg=0.0,bb=0.0; void processMenuEvents(int option) switch (option) case changecolor: change(); break; case resumecolor: resume(); break; case quit: exit(0); break; void createGLUTMenus() int menu;menu = glutCreateMenu(processMenuEvents); glutAddMenuEntry(改变颜色,changecolor); glutAddMenuEntry(恢复颜色,resumecolor); glutAddMenuEntry(退出,quit); glutAttachMenu(GLUT_RIGHT_BUTTON); int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(winheight,winwidth); glutInitWindowPosition(0, 0); glutCreateWindow(简易时钟); init(); glutDisplayFunc(display); glutIdleFunc(myidle); glutReshapeFunc(reshape); createGLUTMenus(); glutMainLoop(); return 0;四、程序运行说明4.1 程序运行结果分析程序能够正常运行,点击运行,能弹出来一个漂亮的时钟,所显示的时间与系统时间完全相符和,达到要求。每一秒,秒针跳动一次,每次跳动一个小刻度,时针和分针随秒针逻辑运动。三个表针清楚明了,易于分辨。点击右键能有小弹窗:改变颜色、恢复颜色、退出。都能够很好地实现。 整点时间刻度旁边分别对应添加罗马数字I、II.。4.2 程序运行结果图例 部分运行结果如下: 图一:点击运行,系统时间 图二:点击右键,颜色变换图三:变换颜色成功,点击

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论