ImageVerifierCode 换一换
格式:DOCX , 页数:36 ,大小:218.43KB ,
资源ID:6643700      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6643700.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(图形学实验正式版1.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

图形学实验正式版1.docx

1、图形学实验正式版1第一部分 绪论本指导书是根据计算机图形学课程实验教学大纲编写的,适用于计算机科学与技术的相关专业。一、 本课程实验的作用与任务计算机图形学是研究利用计算机来处理图形的原理、方法和技术的学科。图形的处理包括了图形生成、图形描述、图形存储、图形变换、图形绘制、图形输出等等。计算机图形学与计算机图形处理技术是许多重要应用领域的基础,图形技术已经交叉渗透到各个应用学科中。通过理论学习,再通过相应的实践操作,可以让学生掌握计算机图形技术的知识,培养计算机图形处理的能力,熟悉计算机图形应用软件和系统的设计、使用和组织。本实验课程的任务是让学生学会如何把书本上学到的知识用于解决实际问题,培

2、养软件工作所需要的动手能力;另一方面,能使书本上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。二、 本课程实验的基础知识本课程的主要讲授了计算机图形学的概念,研究内容和应用领域;图形(图像)信息的计算机处理;图形系统的组成和图形设备;图形基元及其属性的生成、操作和实现;图形操作与处理技术;二维及三维图形的表示、变换、窗口-视区变换等操作;图形的窗口与视区,图形的填充与剪裁,图段与图层处理;隐藏线、面消隐技术,计算机图形标准以及图形数据结构和图形程序设计等。三、 本课程实验教学项目及其教学要求序号实验项目名称学时教学目标、要求1Window图形编程基础2目的:掌握如何在编译平台下编辑、编

3、译、连接和运行一个简单的Windows 图形应用程序;要求:掌握Window 图形编程的基本方法;学会使用基本绘图函数和Window GDI 对象;方法:讲课,实验演示。2直线、圆与椭圆的绘制2目的:掌握直线的DDA算法和Bresenham算法的原理并编程实现。理解并掌握圆与椭圆的利用极坐标方程实现的DDA算法的原理;理解并掌握圆的Bresenham算法原理。要求:编程实现直线的DDA算法和Bresenham算法,比较DDA算法和Bresenham算法绘制直线的异同。编程实现圆与椭圆的角度DDA画法。方法:讲课,实验演示。3直线和多边形的裁剪2目的:掌握直线编码裁剪的原理与实现方法;掌握多边形

4、的逐边裁剪的原理与实现方法。要求:编程实现多边形逐边裁剪算法。方法:讲课,实验演示。4VC下OpenGL绘图程序的实现2目的:进一步熟悉OpenGL 的主要功能;要求:掌握OpenGL 的绘图流程和原理;掌握在Visual C+下OpenGL 绘图程序的基本实现方法;方法:讲课,实验演示。总学时8课时第二部分 基本实验指导实验一 Window 图形编程基础一、 实验目的 1、熟练使用实验主要开发平台VC6.0;2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows 图形应用程序;3、掌握Window 图形编程的基本方法;4、学会使用基本绘图函数和Window GDI 对象;二、

5、 实验原理 在程序中,用户可以自己设定绘制图形的形状和画笔的颜色,需要有变量(m_UserColor)记录用户选择的颜色;同理,需要有变量(m_UserShape)记录用户选择的图形。在基于Document-View 的程序中,应用程序几乎所有的绘制工作都是在视图类的OnDraw(CDC*pDC)函数中完成。OnDraw(CDC *pDC)是CView 类中的一个虚成员函数,每次当视窗被重新绘制时,应用程序框架都要调用函数OnDraw(CDC *pDC)。当用户改变了窗口尺寸,或者窗口恢复了以前被遮盖的部分,或者当应用程序改变了窗口的数据时,窗口都需要被重新绘制。用户改变窗口的尺寸,或者窗口恢

6、复以前被遮盖的部分,这两种事件应用程序框架可以自动觉察,并且调用OnDraw()函数。三、 主要仪器及耗材pc机四、 实验内容与步骤1创建一个新的工程【file】【new】【projects】【MFC AppWizard exe】,新建一个工程名字为test。如图所示图1-1 新建一个工程然后点击【ok】,选择【Single Document】,如图所示图1-2 选择工程类型再点击【finish】按钮即可,显示新建工程的信息窗口,如图所示图1-3 显示新建工程的信息点击【ok】即可,此时一个新的工程就建立了,但是一个空的工程,没有实际内容,我们要实现绘图功能,只需要在类CtestView的函数

7、OnDraw()中添加绘图语句即可,我们添加下列三行语句,如图所示: pDC-SetPixel (250,250,RGB(0,0,0); /画一个象素点 pDC-LineTo(300,200); /画直线线 pDC-Ellipse (100,100,150,150); /画圆此时编译并运行此工程,运行结果如图所示:2、编写一个简单绘图程序MyDraw,要求实现下列功能: (1)当用户在客户区按下鼠标左键并移动时,根据鼠标移动的轨迹绘制出指定的线段;(2)重绘窗口时能够显示已绘制的线段,并且能够保存绘制好的图形在磁盘文件中;具体步骤:(1):1利用MFC AppWizardexe向导创建一个SD

8、I应用程序MyDraw,为视图类CMyDrawView添加成员变量: protected: / 定义有关鼠标作图的成员变量 CPoint m_ptOrigin; / 起始点坐标 bool m_bDragging; / 拖拽标记 HCURSOR m_hCross; / 光标句柄2在视图类CMyDrawView构造函数中设置拖拽标记和十字光标。CMyDrawView:CMyDrawView() / TODO: add construction code here m_bDragging=false; / 初始化拖拽标记 / 获得十字光标句柄 m_hCross=AfxGetApp()- LoadSt

9、andardCursor(IDC_CROSS);3利用ClassWizard类向导为视图类添加按下鼠标左键WM_LBUTTONDOWN的消息处理函数。void CMyDrawView:OnLButtonDown( UINT nFlags, CPoint point) / TODO: Add your message . . . . . . SetCapture(); / 捕捉鼠标 :SetCursor(m_hCross); / 设置十字光标 m_ptOrigin=point; m_bDragging=TRUE; / 设置拖拽标记 / CView:OnLButtonDown(nFlags, po

10、int);利用ClassWizard类向导为视图类添加鼠标移动WM_MOUSEMOVE的消息处理函数。void CMyDrawView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message . . . . . . if(m_bDragging) CClientDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point); / 绘制线段 m_ptOrigin=point; / 新的起始点 / CView:OnMouseMove(nFlags, point);利用ClassWiza

11、rd类向导为视图类添加左键释放WM_LBUTTONUP的消息处理函数。void CMyDrawView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message . . . . . . if(m_bDragging) m_bDragging=false; / 清拖拽标记 ReleaseCapture(); / 释放鼠标,还原鼠标形状 / CView:OnLButtonUp(nFlags, point); 利用ClassWizard类向导为视图类添加鼠标移动WM_MOUSEMOVE的消息处理函数。void CMyDrawVie

12、w:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message . . . . . . if(m_bDragging) CClientDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point); / 绘制线段 m_ptOrigin=point; / 新的起始点 / CView:OnMouseMove(nFlags, point);(2)完善程序:1为线段定义新类CLine。选择“Insert|New Class”菜单命令,弹出New Class对话框中,在Class type栏选择

13、Generic Class,在类名Name栏输入CLine,在类名Base classes栏输入CObject,单击OK按钮,自动生成了类CLine的头文件Line.h和实现文件Line.cpp的框架。2为类CLine定义成员变量和成员函数。class Cline : CObjectprivate: / 定义成员变量,表示一条直线起点和终点的坐标 CPoint m_pt1; CPoint m_pt2;public: CLine(); virtual CLine(); CLine(CPoint pt1, CPoint pt2); / 构造函数 void DrawLine(CDC *pDC); /

14、 绘制线段;在Line.cpp中编写成员函数的实现代码: CLine:CLine(CPoint pt1, CPoint pt2) m_pt1=pt1; m_pt2=pt2;void CLine:DrawLine(CDC* pDC) pDC-MoveTo(m_pt1); pDC-LineTo(m_pt2);3一般都使用数组来保存多条线段的数据,而且MFC提供了实现动态数组的类模板。类CObArray支持CObject指针数组,用它定义的对象可以动态生成。这样,可将存放每条线段数据的变量的指针存到CObArray类的对象中。为此在文档类CMyDrawDoc中定义有关的成员变量和成员函数,需要包含C

15、Line类定义的头文件。 #include Line.h#include / 使用MFC类模板class CMyDrawDoc : public CDocument protected: CTypedPtrArray m_LineArray; / 存放线段对象指针的动态数组public: CLine* GetLine(int nIndex); / 获取指定序号线段对象的指针 void AddLine(CPoint pt1, CPoint pt2); / 向动态数组中添加新的线段对象的指针 int GetNumLines(); / 获取线段的数量;成员函数实现:void CMyDrawDoc:A

16、ddLine(CPoint pt1, CPoint pt2) CLine* pLine=new CLine(pt1, pt2); / 新建一条线段对象 m_LineArray.Add(pLine); / 将该线段加到动态数组CLine* CMyDrawDoc:GetLine(int nIndex) if(nIndexm_LineArray.GetUpperBound() / 判断是否越界 return NULL; return m_LineArray.GetAt(nIndex); int CMyDrawDoc:GetNumLines() return m_LineArray.GetSize()

17、; / 返回线段的数量4当鼠标移动时,除了绘制线段,还要保存当前线段的起点坐标和终点坐标。需要在视图类CMyDrawView的OnMouseMove()鼠标移动消息处理函数中添加有关代码。void CMyDrawView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if(m_bDragging) CMyDrawDoc *pDoc=GetDocument(); /获得文档对象指针 ASSERT_VALID(pDoc); /测试文档对象是否

18、运行有效 pDoc-AddLine(m_ptOrigin, point); /加入线段到指针数组 CClientDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point); / 绘制线段 m_ptOrigin=point; / 新的起始点 / CView:OnMouseMove(nFlags, point);5. 修改OnDraw()函数为了在改变程序窗口大小或最小化窗口后重新打开窗口时保留窗口中原有的图形,必须在OnDraw()函数中重新绘制前面利用鼠标所绘制的线段。这些线段的坐标作为类CLine对象的成员变量,所有CLine对象的指针已保存在动

19、态数组m_LineArray中。 void CMyDrawView:OnDraw(CDC* pDC) CMyDrawDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here int nIndex=pDoc-GetNumLines(); / 取得线段的数量 / 循环画出每一段线段 while(nIndex-) / 数组下标从0到nIndex-1 pDoc-GetLine(nIndex)-DrawLine(pDC); / 类CLine的成员函数 五、 实验注意事项本程序对图形的

20、绘制和文字的显示都在视图类的 OnDraw()函数中完成。刷新视图时默认的函数调用过程: CDocument:UpdateAllViews() CView:OnUpdate() CWnd:Invalidate() OnPaint() OnDraw()六、 思考题1、如何利用鼠标拖动来完成图形的绘制?2、最小化应用程序后,再最大化应用程序,出现了什么现象?原来绘制的图形是否消失了?如果消失了,为什么?如何改进?3、如何在现有应用程序的窗口内输入文字信息?改变字体类型,比如宋体改为黑体?实验二 直线、圆与椭圆的绘制一、 实验目的 1进一步学习使用Trubo C和Visual C+的图形功能; 2理

21、解并掌握直线的DDA算法与Bresenham算法的原理; 3比较DDA算法与Bresenham算法绘制直线的异同,进一步加深理解。4理解并掌握圆与椭圆的利用极坐标方程实现的DDA算法的原理5理解并掌握圆的Bresenham算法原理 6. 理解椭圆的中点算法二、 实验原理 DDA算法是一个增量算法。增量算法:在一个迭代算法中,每一步的x、y值是用前一步的值加上一个增量来获得。 通过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。圆的Bresenham算法:以点(0,r)为起点,按顺时针方向生成圆时,相

22、当于在第一象限内,所以 y 是 x 的单调递减函数。y的计算式为:令d1、d2分别为yi到y、yi-1到y的距离,可知:令判断式di=d1-d2,并代入d1、d2,则有:(1)如果di0,则y=yi,即选择当前像素的正右方作为下一个像素,递推公式为:(2)如果di0,则y=yi-1,即选择当前像素的右下方作为下一个像素,递推公式为:(3)计算判别式的初值。初始点为(0,R),则:三、 主要仪器及耗材pc机四、 实验内容与步骤1编程实现直线的DDA算法程序; void CMyView:OnDdaline() CDC *pDC=GetDC(); / 获得设备指针 int x0=100,y0=100

23、,x1=300,y1=200,c=RGB(255,0,0); / 定义直线两端点和直线颜色(红色) float x,y,i; float dx,dy,k; dx=(float)(x1-x0); dy=(float)(y1-y0); k=dy/dx; y=y0; x=x0; if(abs(k)1) for(;xSetPixel(x,int(y+0.5),c); y=y+k; if(abs(k)=1) for(;ySetPixel(int(x+0.5),y,c); x=x+1/k; ReleaseDC(pDC); /释放设备指针2编程实现直线Bresenham算法程序及整数Bresenham算法程

24、序;直线的Bresenham算法实现:void CTestView :OnBresenhamline() CDC *pDC=GetDC(); int x1=100,y1=200,x2=600,y2=800,color=RGB(0,0,255); int i,x,y,dx,dy; float k,e; dx=x2-x1; dy=y2-y1; k=dy/dx; e=-0.5; x=x1; y=y1; for(i=0;iSetPixel(x,y,color); x+; e=e+k; if(e=0) y+; e=e-1; 直线的整数Bresenham算法实现:void CTestView:OnBres

25、enhamline() CDC *pDC=GetDC(); int x0=100,y0=100,x1=500,y1=600,color=RGB(0,0,255); int i,x,y,dx,dy; float k,e; dx=x1-x0; dy=y1-y0; e=-dx; x=x0; y=y0; for(i=0;iSetPixel(x,y,color); x+; e+=2*dy; if(e=0) y+;e=e-2*dx; ReleaseDC(pDC);3编程实现圆的Bresenham算法程序;圆的Bresenham算法实现:void CMyView:OnBresenhamcircle() CD

26、C *pDC=GetDC(); int x0=100,y0=100,x,y,r=80,c=0; /黑色圆弧 float e,d; e=3-2*r;x=0;y=r; while(x=y) if (eSetPixel(x+x0,y+y0,c); pDC-SetPixel(-x+x0,y+y0,c); pDC-SetPixel(-x+x0,-y+y0,c); pDC-SetPixel(x+x0,-y+y0,c); pDC-SetPixel(y+x0,x+y0,c); pDC-SetPixel(-y+x0,x+y0,c); pDC-SetPixel(-y+x0,-x+y0,c); pDC-SetPix

27、el(y+x0,-x+y0,c); ReleaseDC(pDC);4.椭圆的中点算法实现:void CTestView:OnMidpointellispe() CDC *pDC=GetDC(); int a=100,b=300,x,y,color=50; float d1,d2; x=0;y=b; d1=b*b+a*a*(-b+0.25); pDC-SetPixel(x,y,color); pDC-SetPixel(-x,-y,color); pDC-SetPixel(-x,y,color); pDC-SetPixel(x,-y,color); while(b*b*(x+1)a*a*(y-0.

28、5) if(d1SetPixel(x,y,color);pDC-SetPixel(-x,-y,color);pDC-SetPixel(-x,y,color);pDC-SetPixel(x,-y,color);/*while上半部分*/d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;while(y0) if(d2SetPixel(x,y,color);pDC-SetPixel(-x,-y,color);pDC-SetPixel(-x,y,color);pDC-SetPixel(x,-y,color); 实验内容:画一朵花,用两个椭圆来表示花瓣,用两条抛物线表示花蕊。编写自定义的成员函数MidpointEllise()程序,这个函数用来画椭圆:void CMy2_3View:MidpointEllise(CDC *pDC, int x0, in

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1