计算机图形学课程设计报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

课题名称:算法实现时钟运动学号:1516353011姓名:刘轶男一、设计内容与要求1.1、设计题目算法实现时钟运动1.2、总体目标和要求(1)目标:以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。(2)总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。(3)开发环境:ViusalC++6.01.3、设计要求内容:(1)掌握动画基本原理;(2)实现平面几何变换;功能要求:(1)显示时钟三个时针,实现三根时针间的相互关系;课题名称:算法实现时钟运动学号:1516353011姓名:刘轶男(2)通过右键菜单切换时钟背景与时针颜色;1.4设计方案通过使用OpenGL提供的标准库函数,综合图形学Bresenham画线和画圆的算法,OpenGL颜色模型中颜色表示模式等实现指针式时钟运动,并通过点击右键菜单实习时钟背景与时针颜色的转换。根据Bresenham画线和画圆的算法,画出时钟的指针和表盘。再根据OpenGL颜色模型定义当前颜色。设置当时钟运行时交换的菜单,运行程序时可变换时钟背景与时针的颜色。最后再设置一个恢复菜单恢复开始时表盘与指针的颜色。课题名称:算法实现时钟运动学号:1516353011姓名:刘轶男二、总体设计2.1、过程流程图开始画线画椭圆预定义表盘、各指针的颜色右键恢复菜单可以恢复表盘及各指针原来颜色结束画表盘及各指针右键设置背景色菜单可以改变表盘颜色右键设置时针颜色菜单可以改变时针颜色右键设置分针颜色菜单可以改变分针颜色右键设置秒针颜色菜单可以改变秒针颜色课题名称:算法实现时钟运动学号:1516353011姓名:刘轶男2.2、椭圆的中点生成算法1、椭圆对称性质原理:(1)圆是满足x轴对称的,这样只需要计算原来的1/2点的位置;(2)圆是满足y轴对称的,这样只需要计算原来的1/2点的位置;通过上面分析可以得到实际上我们计算椭圆生成时候,只需要计算1/4个椭圆就可以实现对于所有点的生成了。2、中点椭圆算法内容:(1)输入椭圆的两个半径r1和r2,并且输入椭圆的圆心。设置初始点(x0,y0)的位置为(0,r2);(2)计算区域1中央决策参数的初始值p=ry*ry-rx*rx*ry+1/4*(rx*rx);(3)在区域1中的每个Xn为止,从n=0开始,直到|K|(斜率)小于-1时后结束;1如果p0,绘制下一个点(x+1,y),并且计算p=p+r2*r2*(3+2*x);2如果P=0,绘制下一个点(x+1,y-1),并且计算p=p+r2*r2*(3+2*point.x)-2*r1*r1*(y-1)(4)设置新的参数初始值;p=ry*ry(X0+1/2)*(X0+1/2)+rx*rx*(Y0-1)-rx*rx*ry*ry;(5)在区域2中的每个Yn为止,从n=0开始,直到y=0时结束。1如果P0的情况下,下一个目标点为(x,y-1),并且计算p=p-2rx*rx*(Yn+1)+rx*rx;课题名称:算法实现时钟运动学号:1516353011姓名:刘轶男2如果p=0的情况下,下一个目标点为(x+1,y-1),并且计算p=p-2rx*rx*Y(n+1)+2ry*ry*(Xn+1)+rx*rx;(6)更具对称性原理计算其他3个象限的坐标。(7)急速拿出中心位置在(x1,y1)的位置x=x+x1;y=y+y1;2.3、直线的Bresenham算法原理这种生成直线的算法与数值微分法类似,每次迭代在增量最大方向上均走一步,其方向由增量的正负而定;另一方向上是否也走,取决于计算出来的误差项,误差项所记录的方向同最大增量方向垂直。下面讨论误差项,如图1所示。图1误差项计算示意图设图1中直线满足:01xy,即:01m,所以X为最大增量方向,有1ix-ix=1,故有每点的坐标计算:111iiiiyymxx(4)因此直线上点的显示坐标为[ix,round(iy)],round(iy)表示最靠近y的整数。从图1可以看出,对于计算出来的(ix,iy)点,iy的课题名称:算法实现时钟运动学号:1516353011姓名:刘轶男取之为riy,;计算出来的(1ix,1iy)点,1iy的取值为1,iry。其根据就是因为iy更靠近riy,,1iy更靠近1,iry。图1中A点为1,iry与riy,的中心点,计算BC长度,若值大于0.5,说明在A点之上,应取1,iry,否则取riy,值。设误差:11,()0.5iiirxyy(5)当1()ix0,B点在A点上方,有1,,1iriryy;当1()ix0,B点在A点下方,有1,,iriryy。由公式(4)(5)得:221,()0.5iiirxyy11,0.5iirymy1,11,110.5()00.5()0iiriiiriyymxyymx1111()1()0()()0iiiixmxxmx(6)2.4、图形变换基本原理1、平移变换平移变换函数如下:voidglTranslate{fd}(TYPEx,TYPEy,TYPEz);三个函数参数就是目标分别沿三个轴向平移的偏移量。这个函数课题名称:算法实现时钟运动学号:1516353011姓名:刘轶男表示用于这三个偏移量生成的矩阵乘以当前矩阵。当参数是(0.0,0.0,0.0)时,表示对函数glTranslate*()的操作是单位矩阵,也就是对物体没有影响。2、旋转变换旋转变换函数如下:VoidglRota{fd}TYPEangle,TYPEx,TYPEy,TYPEz);函数中第一个参数是表示目标沿从点(x,y,z)到原点方向逆时针旋转的角度,后三个参数是旋转的方向点坐标。这个函数表示用这四个参数生成的矩阵乘以当前矩阵。当角度参数是0.0时,表示对物体没有影响。3、比例变换比例变换函数如下:VoidglScale{fd}(TYPEx,TYPEy,TYPEz);单个函数参数值就是目标分别沿三个轴方向缩放的比例因子。这个函数表示用这三个比例因子生成的矩阵乘以当前矩阵。这个函数能完成沿相应的轴对目标进行拉伸、压缩和反射三项功能。以参数x为例,若当x大于1.0时,表示沿x方向拉伸目标;若x小于1.0,表示沿x轴方向收缩目标;若x=-1.0表示沿x轴反射目标。其中参数为负值时表示对目标进行相应轴的反射变换。课题名称:算法实现时钟运动学号:1516353011姓名:刘轶男三、详细设计3.1、主程序代码及解释#includestdafx.h#includeClock.h#includemath.h#includeClockDoc.h#includeClockView.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CClockViewIMPLEMENT_DYNCREATE(CClockView,CView)BEGIN_MESSAGE_MAP(CClockView,CView)//{{AFX_MSG_MAP(CClockView)ON_WM_TIMER()ON_WM_CREATE()ON_WM_CONTEXTMENU()//}}AFX_MSG_MAP//StandardprintingcommandsON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)ON_COMMAND(ID_CONTEXT_BK,OnContextBK)ON_COMMAND(ID_CONTEXT_HOUR,OnContextHour)ON_COMMAND(ID_CONTEXT_MINUTE,OnContextMinute)ON_COMMAND(ID_CONTEXT_SECOND,OnContextSecond)ON_COMMAND(ID_CONTEXT_RESTORE,OnContextRestore)END_MESSAGE_MAP()课题名称:算法实现时钟运动学号:1516353011姓名:刘轶男///////////////////////////////////////////////////////////////////////////////CClockViewconstruction/destructionCClockView::CClockView(){//TODO:addconstructioncodeherebrushColor=RGB(240,255,255);HourColor=RGB(0,255,0);MinuteColor=RGB(0,0,255);SecondColor=RGB(255,0,255);}CClockView::~CClockView(){}BOOLCClockView::PreCreateWindow(CREATESTRUCT&cs){//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcsreturnCView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////////CClockViewdrawingvoidCClockView::OnDraw(CDC*pDC){CClockDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahere//获取客户区RECTRect;GetClientRect(&Rect);//计算椭圆中心位置intCenterX=Rect.right/2;intCenterY=Rect.bottom/2;//取当前时间CTimeTime=CTime::GetCurrentTime();CStringstr;inti,x,y;CSizesize;//创建一支黄色的笔,用来画椭圆课题名称:算法实现时钟运动学号:1516353011姓名:刘轶男CPenPen(PS_SOLID,5,RGB(0,0,0));//设置当前画笔,并记下以前的画笔CPen*OldPen=pDC-SelectObject(&Pen);CBrushbrush(brushColor);pDC-SelectObject(&brush);//绘制钟面椭圆pDC-Ellipse(5,5,Rect.right-5,Rect.bottom-5);doubleRadians;//设置字体颜色为红色pDC-SetTextColor(RGB(255,0,0));for(i=1;i=12;i++){//格式化钟点值str.Format(%d,i);size=pDC-GetTextExtent(str,str.GetLength());Radians=(double)i*6.28/12.0;//计算钟点放置的位置x=CenterX

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功