计算机图形学课程教学设计报告_第1页
计算机图形学课程教学设计报告_第2页
计算机图形学课程教学设计报告_第3页
计算机图形学课程教学设计报告_第4页
计算机图形学课程教学设计报告_第5页
免费预览已结束,剩余14页可下载查看

下载本文档

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

文档简介

1、一、设计内容与要求1.1、 设计题目算法实现时钟运动1.2、 总体目标和要求(1)目标:以图形学算法为目标,深入研究。继而策划、设计并实 现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并 能从某些方面作出评价和改进意见。通过完成一个完整程序,经历策 划、设计、开发、测试、总结和验收各阶段,达到巩固和实践计算机 图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培 养认真学习、积极探索的精神。(2)总体要求:策划、设计并实现一个能够充分表现图形学算法的 演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。(3)开发环境:Viusal C+ 6.01.3、 设计要求内

2、容:(1)掌握动画基本原理;(2)实现平面几何变换;功能要求:(1)显示时钟三个时针,实现三根时针间的相互关系;(2)通过右键菜单切换时钟背景与时针颜色;1.4、 计方案通过使用OpenGL提供的标准库函数,综合图形学 Bresenham画 线和画圆的算法,OpenGL颜色模型中颜色表示模式等实现指针式时 钟运动,并通过点击右键菜单实习时钟背景与时针颜色的转换。根据 Bresenham画线和画圆的算法,画出时钟的指针和表盘。再根据 OpenGL颜色模型定义当前颜色。设置当时钟运行时交换的菜单,运 行程序时可变换时钟背景与时针的颜色。最后再设置一个恢复菜单恢 复开始时表盘与指针的颜色。二、总体设

3、计2.1、过程流程图JL画椭圆IT右键设置秒针颜色菜单可以改变秒针颜色右键恢复菜单 可以恢复表盘 及各指针原来颜色I.q 7结束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

4、 + 1/4*(rx*rx);(3)在区域1中的每个Xn为止,从n = 0开始,直到|K|(斜率)小于-1时后结束;<1>如果p < 0 ,绘制下一个点(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 + rx*rx*(Y0-1) - rx*rx*ry*ry;(5)在区域2中的每个Yn为止,从n = 0开始,直到y =

5、0时结束。<1>如果P>0的情况下,下一个目标点为(x,y-1),并且计算p = p - 2rx*rx*(Yn+1) + rx*rx;<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算法原理这种生成直线的算法与数值微分法类似,每次迭代在增量最大方 向上均走一步,其方向由增量的正负而定

6、;另一方向上是否也走,取 决于计算出来的误差项,误差项所记录的方向同最大增量方向垂直。 下面讨论误差项 ,如图1所示。图1误差项计算示意图1设图1中直线满足:0 x ,即:0 m 1,所以X为最大增yi i yi m量方向,有xi 1-xi=1,故有每点的坐标计算:xi 1 xi 1(4)因此直线上点的显示坐标为xi ,round( yi),round(yi)表示最靠近y的整数。从图1可以看出,对于计算出来的(xi, yi)点,yi的 取之为yi,r;计算出来的(xi1, yi1)点,yi1的取值为yi 1,r。其根据 就是因为yi更靠近yi,r, yi1更靠近yi1r。图1中A点为yi 1与

7、yi,r的中心点,计算BC长度,若值大于0.5 , 说明在A点之上,应取yi 1,r ,否则取yi,值。设误差:(xi1)yi1yi,r0.5 (5)当(xi 1)0,B 点在 A 点上方,有 yi 1,r yi,r 1;当 (xi1)<0, B点在 A点下方,有 yi 1,r yi,r。由公式(4) (5)得:(xi 2) yi 2yi 1,r0.5yi 1 myi 1,r0.5yi 1 yi,r 1 m 0.5(xi 1)0yi 1 yi,r m 0.5(xi 1)0(xi 1)m 1(xi 1)0(xi 1m)(xi 1)0(6)2.4、 图形变换基本原理1、平移变换平移变换函数如

8、下:void glTranslatefd(TYPE x, TYPE y, TYPE z);三个函数参数就是目标分别沿三个轴向平移的偏移量。这个函数表示用于这三个偏移量生成的矩阵乘以当前矩阵。当参数是 (0.0,0.0,0.0) 时,表示对函数 glTranslate*()的操作是单位矩阵,也就是对物体没有影响。2、旋转变换旋转变换函数如下:Void glRotafdTYPE angle, TYPE x, TYPE y, TYPE z) ;函数中第一个参数是表示目标沿从点(x,y,z)到原点方向逆时针旋转的角度,后三个参数是旋转的方向点坐标。这个函数表示用这四个参数生成的矩阵乘以当前矩阵。当角度

9、参数是0.0时,表示对物体没有影响。3、比例变换比例变换函数如下:Void glScalefd(TYPE x, TYPE y, TYPE z) ;单个函数参数值就是目标分别沿三个轴方向缩放的比例因子。这个函数表示用这三个比例因子生成的矩阵乘以当前矩阵。这个函数能完成沿相应的轴对目标进行拉伸、压缩和反射三项功能。以参数 x为例,若当x大于1.0时,表示沿x方向拉伸目标;若 x小于1.0,表示沿x轴方向收缩目标;若 x=-1.0表示沿x轴反射目标。其中参数为负值时表示对目标进行相应轴的反射变换。三、详细设计3.1、主程序代码及解释#include "stdafx.h"#incl

10、ude "Clock.h"#include "math.h"#include "ClockDoc.h"#include "ClockView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE口 = _FILE_;#endif/ CClockViewIMPLEMENT_DYNCREATE(CClockView, CView)BEGIN_MESSAGE_MAP(CClockView, CView)/AFX_MSG_MAP(

11、CClockView)ON_WM_TIMER()ON_WM_CREATE()ON_WM_CONTEXTMENU()/AFX_MSG_MAP/ Standard printing commandsON_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

12、(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()/ / CClockView construction/destructionCClockView:CClockView()/ TODO: add construction code herebrushColor = RGB

13、(240,255,255);HourColor = RGB(0,255,0);MinuteColor = RGB(0,0,255);SecondColor = RGB(255,0,255);CClockView:CClockView()BOOL CClockView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CClockView dra

14、wingvoid CClockView:OnDraw(CDC* pDC) CClockDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/获取客户区RECT Rect;GetClientRect(&Rect);计算椭圆中心位置int CenterX = Rect.right/2;int CenterY = Rect.bottom/2;取当前时间CTime Time = CTime:GetCurrentTime();CString str;int i,x,y;CSi

15、ze size;创建一支黄色的笔,用来画椭圆CPen Pen(PS_SOLID,5,RGB(0,0,0);设置当前画笔,并记下以前的画笔CPen *OldPen = pDC->SelectObject(&Pen);CBrush brush(brushColor);pDC ->SelectObject(&brush);绘制钟面椭圆pDC->Ellipse(5,5,Rect.right-5,Rect.bottom-5);double Radians;设置字体颜色为红色pDC->SetTextColor(RGB(255,0,0);for(i = 1;i <

16、;= 12;i+)格式化钟点值str.Format("%d",i);size = pDC->GetTextExtent(str,str.GetLength();Radians = (double)i*6.28/12.0;计算钟点放置的位置x = CenterX - (size.cx/2) + (int)(double)(CenterX - 20)* sin(Radians);y = CenterY - (size.cy/2) - (int)(double)(CenterY - 20)* cos(Radians);绘制钟点pDC->TextOut(x,y,str)

17、;计算时钟指针的夹角Radians = (double)Time.GetHour() + (double)Time.GetMinute()/60.0 + (double)Time.GetSecond()/3600.0;Radians *= 6.28/12.0;创建时钟指针画笔CPen HourPen(PS_SOLID,5,HourColor);pDC->SelectObject(&HourPen);绘制时钟指针pDC->MoveTo(CenterX,CenterY);pDC->LineTo(CenterX + (int)(double)(CenterX/3)*sin(

18、Radians),CenterY - (int)(double)(CenterY/3)*cos(Radians);Radians = (double)Time.GetMinuteO+(double)Time.GetSecond()/60.0;Radians *= 6.28/60.0;创建分钟指针画笔CPen MinutePen(PS_SOLID,3,MinuteColor);pDC->SelectObject(&MinutePen);绘制分钟指针pDC->MoveTo(CenterX,CenterY);pDC->LineTo(CenterX + (int)(doubl

19、e)(CenterX*2)/3)*sin(Radians), CenterY - (int)(double)(CenterY*2/3)*cos(Radians);Radians = (double)Time.GetSecond();Radians *= 6.28/60.0;创建秒钟指针画笔CPen SecondPen(PS_SOLID,1,SecondColor);pDC->SelectObject(&SecondPen);绘制秒钟指针pDC->MoveTo(CenterX,CenterY);pDC->LineTo(CenterX + (int)(double)(Ce

20、nterX*4)/5)*sin(Radians), CenterY - (int)(double)(CenterY*4)巧*cos(Radians);pDC->SelectObject(OldPen);/ CClockView printingBOOL CClockView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CClockView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/

21、TODO: add extra initialization before printingvoid CClockView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printingIlllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll/ CClockView diagnostics#ifdef _DEBUGvoid CClockView:AssertValid() const CView

22、:AssertValid();void CClockView:Dump(CDumpContext& dc) constCView:Dump(dc);CClockDoc* CClockView:GetDocument() ll non-debug version is inline ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CClockDoc); return (CClockDoc*)m_pDocument;#endif ll_DEBUGlllllllllllllllllllllllllllllllllllllllllllllllllll

23、llllllllllllllllllllllll CClockView message handlersvoid CClockView:OnTimer(UINT nIDEvent) ll TODO: Add your message handler code here andlor call default InvalidateRect(NULL,true);UpdateWindow();CView:OnTimer(nIDEvent);int CClockView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCrea

24、teStruct) = -1)return -1;ll TODO: Add your specialized creation code here SetTimer(1,1000,NULL);return 0;void CClockView:OnContextMenu(CWnd* pWnd, CPoint point) ll TODO: Add your message handler code hereCMenu menu;menu.LoadMenu(IDR_CONTEXTMENU);CMenu* pContextMenu = menu.GetSubMenu(O);pContextMenu-

25、>TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTT ON,point.x,point.y,AfxGetMainWnd();void CClockView:OnContextBK() brushColor = RGB(255,228,181);void CClockView:OnContextHour() HourColor = RGB(255,0,0);void CClockView:OnContextMinute() MinuteC010r = RGB(128,128,0);void CClockView:OnConte

26、xtSecond()SecondC010r = RGB(0,192,255);void CClockView:OnContextRestore() brushColor = RGB(240,255,255);HourColor = RGB(0,255,0);MinuteColor = RGB(0,0,255);SecondColor = RGB(255,0,255);四、程序运行说明4.1 程序运行结果分析单击运行,生成一个椭圆表盘时钟,其表盘与各指针颜色各不相 同,用右键五个菜单修改表盘与指针颜色,菜单”设置背景色”来改 变表盘颜色、菜单”设置时针颜色”来改变时针指针颜色、菜单”设 置分针颜色”来改变分针指针颜色、菜单”设置秒针颜色”来改变秒 针指针颜色、用“恢复”菜单来还原成表盘与指针原来的颜色。改变 后的颜色与原来颜色也不各不相同,改变后只能是指定的颜色,不足 就是没有对话框多种颜色用来选择,颜色有点单一,用恢复菜单可以 恢复原来颜色。因为程序里调用了windows的时间函数,所以显示的时间永远跟电脑时间同步。此结果的实现是通过MFC方法实现的。基本上达

温馨提示

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

评论

0/150

提交评论