计算机图形学课程设计_第1页
计算机图形学课程设计_第2页
计算机图形学课程设计_第3页
计算机图形学课程设计_第4页
计算机图形学课程设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、成都理工大学课程设计实验报告 课程名称 程序设计 院 系 信科院数字媒体技术系 班 级 数字媒体技术二班 所属小组 第四组 姓 名 秦瑶 学 号 201113050222 指导教师 何建军 2012年12月 02日目 录1、课程设计目的12、 课程设计内容13、 算法描述14、 程序结构35、 程序代码36、 程序运行结果127、自我总结13计算机图形学课程设计报告一、 设计目的本学期学习了计算机图形学的概论原理与算法,以及上机实习课,通过计算机图形学课程设计,学习了一些新知识,了解了VC+的另一种功能,计算机绘图,而且理解和掌握工程文件与菜单函数,以及中点画圆算法、Bresenham画圆算法

2、,并掌握以上算法生成圆等图形的基本过程,提高我们对计算机图形学的了解与运用技巧,同时通过此次课程设计提高动手实践能力与学习分析能力并且加大练习来巩固C和C+编程,来为未来工作中程序设计打下坚实基础。二、 设计内容两种算法圆的生成,即中点画圆法和Bresenham画圆法三、 算法描述中点画圆算法 讨论圆心原点 (0,0),半径为R的圆的第二个八分圆。考虑生成的圆从(0,r)到(,) 顺时针绘制最佳逼近该圆弧的像素序列。设函数为F(x,y)=的构造圆,圆上的点为F(x,y)=0,圆外的点为F(x,y)>0,圆内的点为F(x,y)<0,M为P1P2线段中点,即 构造判别式:若d<0

3、,则应取P1为下一像素,再下一像素的判别式为:判别式的增量为: 若d>=0,则应取P2为下一像素,再下一像素的判别式为:判别式的增量为: 这里第一个像素是(0,r),判别式d的初始值为: d0=F(1,r-0.5)=1.25-r算法实现时,考虑初值d0为浮点数,但是其增量均为整数,为减少计算量,提高生成速度,可以令d0=1-r.判别式的d<0也相应的变为d<0.25。Bresenham画圆算法设圆的半径为r,考虑圆心在(0,0),从x=0,y=r开始的顺时针方向的1/8圆周的生成过程。x每步增加1,从x=0开始,到x=y结束,即有;相应的,则在两种可能中选择:或者。选择的原则

4、是考察精确值y是靠近yi还是靠近yi-1。计算式为:令pi=d1-d2,并带入d1,d2,则有pi被称为误差项。如果pi<0,下一个像素点,否则pi的递归式为: pi的初值由式(3.9)代人xi=0,yi=r,得:p0=3-2r所以圆周生成的算法思想如下:1. 求误差值,p0=3-2r,i=1,画点(0,r)2. 求下一个光栅位置,其中,如果pi<0,则,否则画点(xi+1,yi+1)3. 计算下一个误差,如果pi<0,则,否则4. i=i+1,若x=y则结束,否则返回步骤2.四、程序结构首先要弄懂Bresenham和中点画圆的算法的思想,并参照课本写出算法,然后试图把算法改

5、成真正的C程序,接着创建工程文件,然后编辑菜单资源,接下来利用ClassWizard为应用程序添加与菜单项相关的消息处理函数。然后在TestView.cpp文件中添加与算法对应的程序结构代码。即先编好中点画圆算法的程序,再在相应菜单函数中调用它,Bresenham算法也是如此。五、程序代码#include "stdafx.h"#include "Test.h"#include "InputRDlg.h"#include "TestDoc.h"#include "TestView.h"#defin

6、e ROUND(a) int(a+0.5) /四舍五入#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CTestViewIMPLEMENT_DYNCREATE(CTestView, CView)BEGIN_MESSAGE_MAP(CTestView, CView)/AFX_MSG_MAP(CTestView) ON_COMMAND(ID_MENUMPCircle,OnMENUMPcircle)ON_COMMAND(ID_Bresenham, OnBresenham)

7、/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)END_MESSAGE_MAP()/ CTestView construction/destructionCTestView:CTestView()/ TODO: add construction code he

8、reCTestView:CTestView()BOOL CTestView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CTestView drawingvoid CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add

9、draw code for native data here/ CTestView printingBOOL CTestView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CTestView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CTestView:OnEndPrinting(CD

10、C* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CTestView diagnostics#ifdef _DEBUGvoid CTestView:AssertValid() constCView:AssertValid();void CTestView:Dump(CDumpContext& dc) constCView:Dump(dc);CTestDoc* CTestView:GetDocument() / non-debug version is inlineASSERT(m_pDocumen

11、t->IsKindOf(RUNTIME_CLASS(CTestDoc);return (CTestDoc*)m_pDocument;#endif /_DEBUG/ CTestView message handlersvoid CTestView:GetMaxX()/得到客户区的最大横坐标CRect Rect;GetClientRect(&Rect);MaxX=Rect.right;void CTestView:GetMaxY()/得到客户区最大纵坐标CRect Rect;GetClientRect(&Rect);MaxY=Rect.bottom;void CTestVie

12、w:MPcircle()/中点画圆算法double x,y,d; d=1.25-R;x=0;y=R;for(x=0;x<y;x+)CirclePoint(x,y);/调用八分法画圆子函数 if (d<0)d+=2*x+3; elsed+=2*(x-y)+5;y-; void CTestView:CirclePoint(double x, double y)/八分法画圆子函数CClientDC dc(this);COLORREF rgb=RGB(0,0,255);/定义圆的颜色dc.SetPixel(ROUND(x)+MaxX/2,ROUND(y)+MaxY/2,rgb);/x,yd

13、c.SetPixel(ROUND(y)+MaxX/2,ROUND(x)+MaxY/2,rgb);/y,xdc.SetPixel(ROUND(y)+MaxX/2,-ROUND(x)+MaxY/2,rgb);/y,-xdc.SetPixel(ROUND(x)+MaxX/2,-ROUND(y)+MaxY/2,rgb);/x,-ydc.SetPixel(-ROUND(x)+MaxX/2,-ROUND(y)+MaxY/2,rgb);/-x,-ydc.SetPixel(-ROUND(y)+MaxX/2,-ROUND(x)+MaxY/2,rgb);/-y,-xdc.SetPixel(-ROUND(y)+Ma

14、xX/2,ROUND(x)+MaxY/2,rgb);/-y,xdc.SetPixel(-ROUND(x)+MaxX/2,ROUND(y)+MaxY/2,rgb);/-x,yvoid CTestView:OnMENUMPcircle()/菜单函数 / TODO: Add your command handler code hereInputRDlg dlg;R=0;if(dlg.DoModal()=IDOK)R=dlg.m_R;AfxGetMainWnd()->SetWindowText("圆中点算法");RedrawWindow();GetMaxX();GetMaxY

15、();MPcircle();void CTestView:cc(int radius, int centerx, int centery, int color) CClientDC dc(this);int x=0; int y=radius; int delta = 2*(1-radius); int direction; while(y>=0) dc.SetPixel(centerx+x,centery+y,3); dc.SetPixel(centerx-x,centery+y,3); dc.SetPixel(centerx+x,centery-y,3); dc.SetPixel(c

16、enterx-x,centery-y,3); if(delta<0) if(2*(delta+y)-1<0) direction = 1; else direction = 2; else if(delta > 0) if(2*(delta+y)-1<=0) direction = 2; else direction = 3; else direction = 2; switch(direction )case 1: x+; delta += (2*x+1); break; case 2: x+; y-; delta += 2*(x-y+1); break; case 3: y-; delta += (-2*y+1); break; void CTestView:OnBresenham() / TODO: Add your command handler code here R=0; InputRDlg dlg;if(dlg.DoModal()=IDOK)R=dlg.m_R;AfxGetMainWnd()->SetWindowText("Bresenham算法");RedrawWindow();GetMaxX();GetMaxY(); cc(R,700,380,4); 六、运行结果(抓屏显示)七、

温馨提示

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

评论

0/150

提交评论