计算机图形学实验指导书xhp.doc_第1页
计算机图形学实验指导书xhp.doc_第2页
计算机图形学实验指导书xhp.doc_第3页
计算机图形学实验指导书xhp.doc_第4页
计算机图形学实验指导书xhp.doc_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

计算机图形学实验指导书软件学院软件理论系2013年2月22日前 言随着计算机科学与技术的迅猛发展,特别是大规模集成电路和超大规模集成电路技术的飞速发展,计算机已经成为一种高速、费用低的生成图形的有效工具。计算机图形学作为利用计算机生成图形的技术,已经越来越广泛地在各个领域得到应用。随着计算机图形学应用领域的拓宽和应用水平的提高,人们越来越重视对该项技术的研究和利用。当今,计算机图形学已经成为了计算机科学技术领域的一个重要研究方向,并被广泛的应用于科学计算、工程设计、医药、工业、艺术、娱乐业、广告业、教育与培训、商业和政府部门等。鉴于计算机图形学的重要性和应用的广泛性,计算机科学与技术专业将其设置为专业必选的选修课。它主要是研究用计算机及其图形设备来输入、表示、变换、运算和输出图形的原理、算法及系统。通过对本课程的学习,使学生对计算机图形学有一个完整的了解,并为进行计算机图形学应用和研究打下扎实基础。为了让学生深入理解各种图形算法和相关理论知识,贯彻学生学习知识是为了应用知识、应用就要追求创新应用的思想和意识,设计了8个实验。通过实验,使学生更加深入的理解计算机图形系统的工作机理和基本图形生成和处理算法。实现语言为Turbo C 、Visual C+ 6.0、OpenGl,或其它学生掌握的高级语言。这些实验是对学生的一种多全面训练。它着眼于原理与应用的结合,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。在实验过程中,能够培养学生的自学能力、团队协作能力、解决问题能力、软件开发能力等多种能力。目 录实验要求及实验报告规范1实验一 交互式绘图技术的实现2实验二 直线、圆弧及椭圆弧的生成算法5实验三 多边形的区域填充7实验四 二维几何变换9实验五 裁剪算法10实验六 三维图形变换11实验七 曲线与曲面12实验八 真实感图形绘制14参考文献15附录A C程序绘图基础16附录B Visual C+图形程序设计23一、实验目的23二、实验任务(需要课外学时8学时)23三、基础知识和实验步骤23(一) Visual C+ 6.0应用程序开发方法23(二) 图形设备接口和图形程序设计26(三)鼠标编程36(四)菜单程序设计42四、实验总结46附录C OpenGL图形程序设计47实验要求及实验报告规范一、实验的性质、目的和任务本实验是与本专业课计算机图形学相配套的,通过计算机图形学实验教学,引导学生由浅入深地掌握计算机图形学理论与相关算法,具有一定实践体会和相关的编程能力及图形处理的能力,为毕业设计和毕业后从事计算机绘图、计算机辅助设计、辅助教学、辅助工程、图形处理等打下基础。本实验教学主要内容是要求学生编程实现各种图形的绘制,强化学生的程序设计能力和程序调试能力,使学生巩固所学各种图形的生成算法的理论知识。二、实验基本要求实验基本要求:本实验教学的基本要求是: 实验课前,学生必须预习实验指导书中的实验内容,了解本次实验的目的、要求、原理、算法、步骤等,准备好实验的程序设计算法描述与关键分析内容; 准备好程序和测试数据,上机调试、运行; 完成每个实验后进行结果对比分析,完成实验报告。实验内容要求:(1) 认真分析题目的条件和要求,复习相关理论知识,选择适当的解决方案和算法;(2) 编写上机实验程序,作好上机前的准备工作;(3) 上机调试程序,绘制图形,验证算法的正确性;(4) 分析和解释运行结果;(5) 程序调试完后,须由实验辅导教师在机器上检查运行结果;(6) 按照要求书写每次实验的实验报告。 (7) 要求独立完成上述各项。三、实验环境实验设备:计算机实验使用的语言:C或Visual C+、OpenGL四、考核与报告(1) 本课程的评分方法是考查,实验作为平时成绩占学期期末总成绩的30%。(2) 每个实验完成后必须完成相应的实验报告。实验成绩组成为:实验报告占40;按照教学计划的实验,现场编程序,演示计算结果占50;创新占10。五、实验报告格式实验报告在书写过程中应该将以下问题写清楚1、 实验目的:2、 实验要求:3、 实验内容:4、 实验题目: 5、 设计原理与思想: 6、 对应程序:7、 实验结果(输出图形)及其分析: 8、 计算中出现的问题,解决方法及体会:实验一 交互式绘图技术的实现一、实验目的1、掌握各种交互式绘图技术及其原理;2、掌握Visual C+集成编程环境的使用,图形设备接口和常用图形程序设计、鼠标编程、画刷与画笔以及菜单设计等,能够利用Visual C+实现各种交互式绘图技术;3、了解OpenGL的基本操作及其库函数,能够通过OpenGL库函数实现各种交互式绘图技术。二、实验要求1、用Visual C+设计一个简易的交互式绘图软件,能够实现铅笔绘图,以及直线、圆等基本图形的绘制;2、能够实现橡皮筋画线或圆、拾取、拖动、撤销和重做等交互式技术;3、能够用OpenGL函数库实现橡皮筋技术和拾取操作。三、算法提示(一)铅笔绘图的实现:1、建一个MFC AppWizard(exe)工程(具体操作见附录B),新增“绘图”菜单,并在该菜单下添加子菜单“铅笔”;2、向视图类中添加1个菜单消息响应函数和3个鼠标消息响应函数,并输入时间处理程序代码。(1)新增成员变量: public: int drawMode; /画图模式,1表示铅笔 int isDrag; /鼠标是否是拖动,1表示拖动,0表示移动 CPoint p0; /铅笔的起点(2)初始化变量:CMy11View:CMy11View()/ TODO: add construction code here drawMode=0; isDrag=0;(3)在消息响应函数中添加代码void CMy11View:OnPen()/“铅笔”菜单响应函数/ TODO: Add your command handler code here drawMode=1; /设置为铅笔模式void CMy11View:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default isDrag=1; /设置为拖动 p0=point; /记下起点CView:OnLButtonDown(nFlags, point);void CMy11View:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default isDrag=0; /设置为移动CView:OnLButtonUp(nFlags, point);void CMy11View:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if(isDrag & drawMode=1) /如果是鼠标拖动,且是铅笔模式 CDC* pdc=GetDC(); pdc-MoveTo(p0); pdc-LineTo(point); p0=point; ReleaseDC(pdc); CView:OnMouseMove(nFlags, point);(4)编译运行程序,验证运行结果。(二)橡皮筋画直线的实现(1)并在“绘图”菜单下再添加子菜单“直线”,添加“直线”菜单响应函数,并编写代码void CMy11View:OnLine() /“直线”菜单响应函数/ TODO: Add your command handler code heredrawMode=2; /设置为绘制直线模式(2)新增成员变量CPoint p1;(3)修改OnLButtonDown以及OnMouseMove函数的代码:void CMy11View:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultisDrag=1;p0=point;p1=point;CView:OnLButtonDown(nFlags, point);void CMy11View:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultif(isDrag) /鼠标拖动CDC* pdc=GetDC();switch (drawMode)case 1:pdc-MoveTo(p0); pdc-LineTo(point);p0=point;break; /铅笔绘图case 2: pdc-SetROP2(R2_NOTXORPEN); /采用异或模式绘图 pdc-MoveTo(p0); pdc-LineTo(p1); /擦除原直线 pdc-MoveTo(p0); pdc-LineTo(point);p1=point;break; /橡皮筋画直线ReleaseDC(pdc);CView:OnMouseMove(nFlags, point);(4)编译运行程序,验证运行结果。(三)OpenGL中橡皮筋技术与拾取操作的实现,见教材62-70页。四、实验结果、分析和总结1对程序进行分析和比较,你还能提出哪些改进和扩充?例如:其他交互式绘图技术的实现。2总结从本次实验中学到了那些知识点或者有哪些感受?实验二 直线、圆弧及椭圆弧的生成算法一、实验目的1、几种直线生成算法的比较,特别掌握用Bresenham直线生成算法。2、几种圆弧生成算法的比较,掌握Bresenham圆弧生成算法。3、几种椭圆弧生成算法的比较,掌握Bresenham椭圆弧生成算法。4、掌握线型与线宽处理技术。二、实验要求1、用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。2、用Bresenham生成算法在屏幕上绘制出圆弧的图形。3、用Bresenham生成算法在屏幕上绘制出椭圆弧的图形。4、用动画的方式表演图形的生成。三、算法提示1、有关直线生成算法有:DDA(数值微分)直线算法、逐点比较法、直线Bresenham生成算法。直线Bresenham生成算法思想如下(第一象限,且斜率k0,则yi+1=yi+1,否则 yi+1=yi;3) 画点(xi+1,yi+1);4) 求下一个误差Pi+1点,如果Pi0,则Pi+1=Pi+2dy-2dx,否则 Pi+1=Pi+2dy;5) i=i+1,如果i1的情况,可交换变量x和y,y每次长1个单位。对Pi进行判断,xi+1=xi或xi+1=xi+1。2、有关圆弧生成算法有:逐点比较法、DDA(数值微分)直线算法、圆的Bresenham生成算法。圆的生成算法一般将圆划分为8等份,只需计算(900,450)的八分之一圆弧,其它用对称法求得(参见图2-1 b)。Bresenham生成算法思想如下(第一象限,且斜率k1的情况):1) 计算误差初值P1=3-2r,i=1,画点(0,r);2) 求下一个光栅点位置 xi+1=xi+1 如果Pi0,则yi+1=yi,否则 yi+1=yi-1;3) 画点(xi+1,yi+1);4) 求下一个误差Pi+1点,如果Pi0,则Pi+1=Pi+2xi+6,否则 Pi+1=Pi+4(xi-yi)+10;5) i=i+1,如果x=y则结束操作,否则转步骤2。圆Bresenham算法的算式简单,只需做加减法和乘4运算3对屏幕布局的考虑适当选取坐标,将屏幕分成几个区域性,在每个区域内实现一种算法,生成一个图形。也可用delay实现延时实现动画。四、实验结果、分析和总结1查看实验结果,验证算法的正确性;2对程序进行分析和比较,你还能提出哪些改进和扩充?例如:(1)线刷子绘制直线和圆;(2)方形刷子绘制直线和圆;(3)虚线和点划线的绘制;3总结从本次实验中学到了那些知识点或者有哪些感受?实验三 多边形的区域填充一、实验目的1通过实验,进一步理解和掌握几种常用多边形填充算法的基本原理;2掌握多边形区域填充算法的基本过程;3掌握在Visual C+环境下用多边形填充算法编程实现指定多边形的填充。二、实验要求1用种子填充算法实现区域填充。2扫描线填充算法实现区域填充。3用x-扫描线算法实现多边形的填充(可选);4实现边缘填充算法和边标志填充算法(可选);三、算法提示(一)多边形的扫描转换多边形的扫描转换:从多边形的顶点信息出发,求出位于其内部的各个象素,并将其颜色值写入帧缓存中相应单元的过程。多边形的扫描转换算法有:X扫描线算法、边缘填充算法等。1、X扫描线算法(1)基本思想:按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的所有象素。l (2)算法步骤:u 确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y值(ymin和ymax)。u 从y=ymin到y=ymax,每次用一条扫描线进行填充。u 对一条扫描线填充的过程可分为四个步骤:求交;排序;交点配对;区间填色。 2、边缘填充算法基本思想:按任意顺序处理多边形的每条边。处理时,先求出该边与扫描线的交点,再对扫描线上交点右方的所有象素取反。(二)区域填充区域填充是指从区域内的某一个象素点(种子点)开始,由内向外将填充色扩展到整个区域内的过程。区域是指已经表示成点阵形式的填充图形,它是相互连通的一组像素的集合。1、栈结构实现4-连通边界填充算法的算法步骤为: 种子象素入栈;当栈非空时重复执行如下三步操作: (a)栈顶象素出栈; (b)将出栈象素置成填充色; (c)检查出栈象素的4-邻接点,若其中某个象素点不是边界色且未置成多边形色,则把该象素入栈。 2、栈结构实现8-连通边界填充算法的算法步骤为:种子象素入栈;当栈非空时重复执行如下三步操作:(a) 栈顶象素出栈;(b) 将出栈象素置成填充色;(c) 检查出栈象素的8-邻接点,若其中某个像素点不是边界色且未置成多边形色,则把该像素入栈。四、实验结果、分析和总结1查看实验结果,验证算法的正确性;2对程序进行分析和比较,编写种子填充算法、多边形填充算法和图案填充算法? 3总结从本次实验中学到了那些知识点或者有哪些感受?实验四 二维几何变换一、实验目的进一步加深对常用的二维几何变换的理解,如平移、旋转、放大缩小等。掌握变换顺序和变换矩阵。二、实验要求1 通过二维几何变换的数学模型,编写平移、旋转、放缩、对称变换;2 绘制一个北极星图案或字母图案,如下图所示,实现该图形的平移、旋转、放缩、对称等几何变换; 3 加入鼠标功能,实现图形的拾取及交互式移动等功能。三、算法提示二维几何图形的步骤: 1、选取二维空间坐标系。2、在选定的坐标系中,确定图形走笔顺序或连点顺序(拓扑结构) ,写出图形中上各顶点位置坐标,同时引入齐次坐标表示成n(点数)*3阶矩阵。3、根据图形的拓扑结构及顶点坐标,绘制图形。4、将图形的顶点坐标矩阵乘以变换矩阵(不同的变换乘以不同的变换矩阵),得到变换后的顶点坐标,再根据图形的拓扑结构及顶点坐标,绘制变换之后的图形。四、实验分析和总结1 分析程序运行结果,进一步完善程序;2 参照Autocad的交互式方式,实现交互式放缩、旋转和对称变换。3 写出实验体会和小结,总结通过本次实验,学习和掌握了哪些知识点?实验五 裁剪算法一、实验目的1、熟悉各种直线裁剪算法,包括CohenSutherland线段裁剪算法,中点分割线段裁剪算法,Liang-Barsky裁剪算法等,掌握编码裁剪法的编程方法和步骤。2、掌握多边形逐边裁剪(Sutherland-Hodgman)法的编程方法和步骤。3、了解字符裁剪算法的原理与编程方法。二、实验要求1、 实现直线的裁剪。在屏幕上绘制出一个矩形作为裁剪边界,再用不同的颜色绘出几个由线段组成的简单几何图形,它们和裁剪边界可相交或不相交。按一个键,实现一条线段的裁剪,裁剪后的线段可用另一种颜色绘制,继续按键,直至全部线段裁剪完。2、实现多边形逐边裁剪算法。三、算法提示1、Sutherland-Cohen(编码) 裁剪算法用数组保存裁剪边界的坐标值和被裁剪边界的坐标值;根据逐边裁剪方法对被裁剪边界进裁剪,计算出裁剪后的坐标;再将裁剪后的直线用不同颜色绘制到屏幕上。Sutherland-Cohen(编码)算法的思想是:对于每条线段P1P2分为三种情况处理。(1)若P1P2完全在窗口内,则显示该线段P1P2简称“取”之。(2)若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。(3)若线段既不满足“取”的条件,也不满足“弃”的条件,则在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。2、Sutherland-Hodgman 多边形裁剪算法多边形裁剪算法的关键在于,通过裁剪,不仅要保留窗口内多边形的边界部分,而且要将窗框有关部分按一定的次序插入多边形保留边界之间,从而使多边形的边仍然保持封闭状态。Sutherland-Hodgman 多边形裁剪算法:令多边形的顶点按边线逆时针走向排序P1、P2、Pn,多边形各边先与上窗框求交。求交后删去多边形一窗框之上的部分,并插入窗边及延长线与多边形的交点之间的部分,从而形成一个新多边形。然后,新的多边形按相同的方法与右窗框相剪裁。如此重重,直至多边形与各窗框都裁剪完毕。四、实验分析和总结1、分析程序运行结果,进一步完善程序;2、对程序进行分析和比较,你还能提出哪些改进和扩充?例如:字符、圆等其他图元的裁剪。3、写出实验体会和小结,总结通过本次实验,学习和掌握了哪些知识点?实验六 三维图形变换一、实验目的1、复习用二维平面来表示三维立体图形的正等测投影或斜二侧投影图形。2、编程实现三维简单立体的平移变换、旋转变换、对称变换、变比变换、错切变换。3、对变换后的简单三维几何体用正等测投影或斜二侧投影图形来表示。4、用编写的绘制三维几何图形的函数。二、基本要求1、在屏幕上绘制出如下图所示或其他简单几何体的正等测投影的几何图形。 2、对上述简单三维几何体进行三维平移变换、旋转、缩放、对称等几何变换,用不同的颜色在屏幕上绘制出变换后的三维图形正等测投影图。三、算法提示1、三维图形的变换实际上是一个变换矩阵,平面图形是由若干个三维点P(xi,yi,zi)组成,经过变换后的三维点P(xi,yi ,zi),其变换公式为: x y z 1 =x y z 1T对于不同的变换,都是用矩阵乘法来计算坐标,只需改变变换矩阵即可。因此对每一种坐标变换可编成一个子程序。2、 变换后的三维点并不能直接在二维屏幕上绘制出来,必须用到前一个实验的内容,选用一个轴测投影,将三维点经过轴测投影变换后,得出P*(x*i,y*i ,z*i)x* y* z* 1 =x y z 1T正等测3、编程时的技巧用数组将三维图形的特征坐标点(顶点)保存,由特征坐标点(顶点)绘制出三维图形的命令(一般由直线命令组成)编写一个绘图子程序,调用绘图子程序绘制出变换以前的图形(必须经过轴测投影变换),根据不同的三维几何变换,选用相应三维坐标变换公式(调用相应的子程序)得出变换后的坐标;再经轴测投影变换后,得出P*(x*i,y*i ,z*i),调用绘图子程序绘制出变换后的图形。四、实验分析和总结1、分析程序运行结果,进一步完善程序。2、对程序进行分析和比较,你还能提出哪些改进和扩充?例如:绘制三维立体图形的斜二侧投影图形、透视投影等。3、写出实验体会和小结,总结通过本次实验,学习和掌握了哪些知识点?实验七 曲线与曲面一、实验目的根据曲线和曲面的基础知识和常用曲线的数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲线数学模型的理解。二、实验要求 1、三次Bezier曲线与三次B样条曲线的编程实现。在主窗口中添加Bezier曲线和B样条曲线的菜单,当运行系统,点击相应菜单时,根据系统给定的四个点,在屏幕上绘制三次Bezier曲线或三次B样条曲线。2、交互式绘制三次Bezier曲线或三次B样条曲线的编程实现。添加鼠标功能,进行交互式绘制三次Bezier曲线或三次B样条曲线。当用鼠标选择四个点时,绘出第一条Bezier曲线或B样条曲线,以后每增加一个点,就会增加一段曲线。Esc键表示鼠标选择点结束。 3、Bezier曲面与B样条曲面的编程实现。在屏幕上绘制出一个Bezier曲面或B样条曲面,并用不同的颜色标出边界网格。三、算法提示(一)Bezier曲线给定空间n+1个点的位置矢量Pi(i=0,1,2,n),则Bezier参数曲线上各点坐标的插值公式是: 其中,Pi构成该Bezier曲线的特征多边形,Bi,n(t)是n次Bernstein基函数:(二)B样条曲线 以Bernstein基函数构造的Bezier曲线或曲面有许多优越性,但有两点不足:其一是Bezier曲线或曲面不能作局部修改;其二是Bezier曲线或曲面的拼接比较复杂。1972年,Gordon、Riesenfeld等人提出了B样条方法,在保留Bezier方法全部优点的同时,克服了Bezier方法的弱点。B样条曲线的方程定义为:是B样条基函数,其定义如下:(三)Bezier曲面1、设Pi j(i=0,1,2,n,j=0,1,m)为(n+1)(m+1)个空间点列,则mn次Bezier曲面的方程为:其中,Bim(u)=Cmiui(1-u)m-i,Bjn(u)=Cnjvj(1-v)n-j,是Bernstern基函数。依次用线段连接Pi j(i=0,1,2,n,j=0,1,m)中相邻两点所形成的的空间网格,称为特征网格。当n=m=3时为双三次Bezier曲面,其方程为: 用矩阵表示为:S(u,v)=UMPMTVT其中 U=u3,u2,u1,u,V= v3,v2,v1,v 2、程序设计根据用Bezier曲面的定义,输入Bezier曲面的特征多边形(例如双三次Bezier曲面输入16个型值点),用数组将坐标点保存;然后把u从现01分成m等分,把v从现01分成n等分,按上述公式算出Bezier曲面上的点,在u方向画出m+1条曲线,在v方向画出n+1条曲线,就得到Bezier曲面。四、实验分析和总结1、分析程序运行结果,进一步完善程序; 2、对程序进行分析和比较,你还能提出哪些改进和扩充?3、写出实验体会和小结,总结通过本次实验,学习和掌握了哪些知识点?实验八 真实感图形绘制一、实验目的1、了解各种消隐算法的思想及实现方法,理解OpenGL中消隐处理的原理,掌握OpenGL中消隐处理技术;2、了解计算机完成三维场景的真实感图形绘制的原理及步骤,理解Phong光照明模型, 增量式光照明模型,透明算法,纹理算法,光线跟踪算法。掌握OpenGL中光照与表面绘制函数及其操作。二、实验要求 1、利用OpenGL函数实现三维物体的消隐处理; 2、利用OpenGL中提供的光照、表面材质处理、透明处理、表面绘制等函数,实现真实感图形的绘制。三、算法提示OpenGL的工作顺序就是一个从定义几何要素到把象素段写入帧缓冲区的过程。在屏幕上显示图象的主要步骤是以下3步:(1)构造几何要素(点,线,多边形,图象,位图),创建对象的数学描述。在三维空间上放置对象,选择有利的场景观察点。(2)计算对象的颜色,这些颜色可能直接定义,或由光照条件及纹理间接给出。(3)光栅化,把对象的数学描述和颜色信息转换到屏幕的象素。实现实例可以参照教材中的案例。四、实验分析和总结1、分析程序运行结果,进一步完善程序; 2、对程序进行分析和比较,你还能提出哪些改进和扩充?3、写出实验体会和小结,总结通过本次实验,学习和掌握了哪些知识点? 参考文献1、陆枫、何云峰, 计算机图形学基础(第二版), 电子工业出版社 2011-11 2、Edward Angel、Dave Shreiner,交互式计算机图形学:基于OpenGL着色器的自顶向下方法(第六版),电子工业出版社, 2012-053、孙家广、胡事民,计算机图形学基础, 清华大学出版社,2011-07 4、潘云鹤等, 计算机图形学原理、方法及应用(第3版) , 高等教育出版社,2011-65、孙家广,计算机图形学(第三版),清华大学出版社,1999。6、Donald Hearn,M.Pauline Baker著, 蔡士杰等译,计算机图形学(第三版),电子工业出版社,2005。7、Dave Shreiner等著,邓郑祥译,OpenGL编程指南(第四版),人民邮电出版社,2005。附录A C程序绘图基础一、实验目的1、 掌握用Turbo C绘图时的步骤。2、 掌握C语言中的基本绘图函数及其用法。3、 掌握简单动画的实现方法。二、用C语言绘制图形的步骤1、为了调用C语言提供的图形库函数,在程序的开头写上文件的包含命令;# include 2、图形系统初始化及关闭图形方式初始化是通过调用 initgraph( )函数来完成 ,它的调用格式为:initgraph (* gdriver,* gmode,* path);该函数的功能是通过从磁盘上装入一个图形驱动程序来初始化图形系统,并将显示器设置到指定图形方式下。参数gdriver, gmode, path的含义参见教材的有关章节。在运行图形程序结束后,又要回到文本方式,以进行其它工作,这时应关闭图形方式。其格式为:closegraph()。3、图形显示器的工作方式1) 文本模式与字符坐标系在未通过图形初始化之前的屏幕上,只能显示字符的方式称为文本模式。C语言能在指定位置显示字符,该坐标系以屏幕的左上角为坐标原点,水平向为x轴,自左向右;垂直方向为y轴,自上向下,坐标原点为(1,1)。能显示的行数、列数及颜色与显示方式有关。Turbo C支持6种不同的文本显示方式。2) 图形模式与点坐标系在屏幕上能显示图形的方式称为图形方式。屏幕是由像素点组成的,通过initgraph函数的gmode参数来指定屏幕的分辨率,分辨率决定了像素点的多少。在图形方式下,屏幕上每个像素的显示位置用点坐标系来描述。在该坐标系中,屏幕的左上角为坐标原点O(0,0),水平向为x轴,自左向右;垂直方向为y轴,自上向下。如图A-1所示。O(0,0)maxxmaxy图A-1 屏幕坐标系分辨率不同,水平方向和垂直方向上的点数也不一样,即其maxx、maxy的数值不同。在Turbo C中,坐标数据有两种形式给出:一种是绝对坐标;另一种是相对坐标。绝对坐标的参考点是坐标的原点O(0,0),x 和y的值只能取规定范围内的正整数,其坐标值在整个屏幕范围内确定。相对坐标是相对于“当前点”的坐标,所以其参考点不是坐标系的原点,而是当前点。要相对坐标中,x和y的取值是相对于当前点在X方向和Y方向上的增量,这个增量可以是正的,也可以是负的,所以x和y的值可以是正整数,也可以是负整数。此外,把在一个窗口范围内确定的坐标也称为相对坐标。三、C语言中的基本绘图函数及其用法1、绘图函数在用绘图函数作图时,有的绘图函数坐标是相对于坐标原点,用绝对坐标。有的绘图函数用相对坐标,这时要随时注意图形的“当前点位置”,它是绘图的起始位置。也就是说,图形总是从当前点开始画图。画完一个图形后,有的当前点不变,仍在原来的位置;而有时会移到新的位置。1) 直线类绘图函数用直线类函数绘制直线图形,可以用两种坐标:一种是绝对坐标;另一种是相对坐标。几个常用的函数: 点的绝对定位函数 moveto(x,y) 点的相对定位函数 moverel(deltayx,deltay)它们不绘制图形,只改变当前点的位置,接着用绘图函数绘图。 指定两个绝对点绘直线函数: line(x1,y1,x2,y2) 该函数不改变当前点的位置。 从当前点到指定的绝对点绘直线函数: lineto(x,y) 该函数画线的同时,将当前点的位置移到(x,y)。 从当前点到指定的相对点绘直线函数: linerel(dx,dy) 该函数画线的同时,将当前点的位置移到(x+dx,y+dy)。设当前坐标为(x,y)则linerel(dx,dy)与lineto(x+dx,y+dy)等价。 读取当前点的位置x,y函数分别为: getx(void),gety(void) 读取x,y轴的最大值函数分别为:getmaxx(void),getmaxy(void)2) 多边形类绘图函数 画矩形函数 rectangle(x1,y1,x2,y2); 画多边形函数:drawpoly(n ,* polypoints)其中参数,n为多边形数;* polypoints 指向一个整形数组,共有2n 个整数组成,每对整数给出了一个多边形顶点(x,y)坐标。 2、图形属性的设置图形属性的设置包括绘制该图形所用的颜色和线型。颜色又分为背景色和前景色:背景色指的是屏幕的颜色,即绘图时的底色;前景是指绘图时图形线条所用的颜色。背景色和前景色的设置,只对设置后所绘制的颜色和线型有作用,对已经绘制的图形无作用。1) 设置前景色设置前景颜色所用的函数 setcolor。其调用格式为:setcolor(color);其中color为一个整型数值,代表所取的颜色。2) 设置背景色设置背景颜色所用的函数 sebktcolor。其调用格式为:setbkcolor(color);其中color为一个整型数值,代表所取的颜色。3)设置线型设置当前绘图所用的线型和线宽,用函数 setlinestyle。线型和线宽的设置仅限于对直线类图形有效。其调用格式为:setlinestyle(sty,pat,b);sty:整型值,用来定义所画直线的类型;pat用户定义线型使用; b整型值,用来定义定义所画直线的线宽。在屏幕上绘制出各种简单的几何图形,要求设置不同的线形和颜色。3、 填充填空是指用指定的模式和颜色来填空一个指定的封闭区域。1) 设置当前的填充模式和颜色设置填充模式和颜色,用函数setfillstyle,其调用格式为:setfillstyle(pattern,color);2) 实施填充对于指定的一块有界的封闭区域进行填充操作,用函数floodfill,其调用格式为:floodfill(x,y,bcolor);参数(x,y)指位于填充区域内任意一点的坐标,该点作为填充的起始点,参数bcolor作为填充区域的边界颜色。如果起始点在封闭区域内,则区域内部被填充;如果起始点在封闭区域外,则区域外部被填充。同学们可以自行验证。3) 其它填充函数以下几个填充函数,均须事先由setfillstyle 函数指定当前的填充模式和颜色。 绘制并填充实椭圆函数: fillellipse(x,y,rx,ry); 绘制并填充实椭圆扇区函数: sector(x,y,angs,ange,rx,ry) 绘制并填充多边形函数:fillpoly(nps ,*pxy)4、 屏幕管理Turbo C2.0 提供了11个函数,用于对屏幕和视区进行管理。1)设置视图区在图形方式下,可用函数setviewport在屏幕上定义一个视图区。视图区相当于一个用于绘图的窗口。视图区的位置和大小用屏幕的绝对坐标定义,并且可把视图区设置为裁剪和不裁剪两种状态。函数setviewport的调用格式为:setviewport(x1,y1,x2,y2,c);参数x1,y1:为视图区矩形的左上角顶点坐标;x2,y2:为视图区矩形的右下角顶点坐标。c为裁剪状态参数。c=1,超出视图区的图形部分被自动裁剪掉;c=0时,对超出部分不作裁剪处理。应注意:视图区建立以后,所有的图形输出坐标都是相对于当前视图区的,即视图区左上角点为坐标(0,0)点,而与视图区和图形在屏幕上的位置无关。在默认情况下,整个屏幕为一个视图区。2)清除视图区清除视图区用函数 clearviewport。它的作用是清除掉当前视图区,将当前点的位置设置于屏幕左上角(0,0)点。调用格式为:clearviewport();3)清屏清屏的函数为 cleardevice ();四、简单动画制作1、最简单的动画的制作最简单的动画实现方法:先在屏幕上绘制一组图形,用delay() 函数进行一定延时,再绘制另一组图形。本方法实现的动画有闪耀感,不连续。五、上机作业题1、编写一个正方珙程序(每一个比前一个稍小),并在其中用不同颜色画15个正方形。2、编写一辆自行车一公路上由右至左快速行驶的程序。自行图案可自行设计。六、实例程序:以下实例程序在Turbo C下调试通过1、演示各种颜色的填充情况的参考源程序# include graphics.hvoid main(void) int gdriver=DETECT,gmode,errorcode; int i,c,x=5,y=6; printf(input color number:n); scanf(%d,&c); initgraph(&gdriver,&gmode,E:TC ); cleardevice(); setbkcolor(14); setcolor(9); for(i=c;ic+8;i+) setcolor(i); rectangle(x,y,x+140,y+104); x=x+70;y=y+52; setfillstyle(1,i); floodfill(x,y,i); getch(); closegraph();2、飘带图案的参考源程序 水平直线的起点和终点坐标均按余弦和正弦函数的规律变化,使形成具有不同长度和不同位置的线段组成的图案,该图案看起来好像是随风飘扬起来的一条飘带。# include graphics.h# include math.h# define PI 3.1415926 void main(void) int gdriver=DETECT,gmode,errorcode; int x1,y1,x2,px=320,py=240; double a; initgraph(&gdriver,&gmode,E:TC ); cleardevice(); setbkcolor(9); setcolor(4); for(a=0;a=PI;a+=PI/380) x1=280*cos(1.6*a)+px; y1=497-(90*sin(8*a)*cos(a/2.5)+py); x2=280*cos(1.8*a)+px; line(x1,y1,x2,y1); getch(); closegraph();3、正多边形绘图程序本程序用子程序的方法来绘制正多边形#include graphics.h#include math.hvoid polygon(int x0,int y0,int a ,int n, float af) int x,y,i,x2,y2; float dtheta,theta; if(n3) return; dtheta=6.28318/n; theta=af*0.0174533; moveto(x0,y0); x=x0; y=y0; for(i=1;i=3;i-) polygon(x,y,a,i,0.0); getch(); closegraph();5、 简单动画源程序,设计人在跑步/* cgwexam0329b.c */#include graphics.h#include conio.h#include stdio.h#include stdlib.h#include dos.hvoid t1(int x1,int x,int y) /*绘制第一幅图形*/ line(0,y/2+72,x,y/2+72); circle(x1,y/2,10); line(x1,y/2+10,x1-5,y/2+38); line(x1-5,y/2+38,x1+5,y/2+52); line(x1+5,y/2+52,x1-12,y/2+65); line(x1-5,y/2+38,x1,y/2+54); line(x1,y/2+54,x1-8,y/2+70); line(x1-8,y/2+10,x1-8,y/2+35); line(x1,y/2+10,x1+1,y/2+25); line(x1+1,y/2+25,x1+10,y/2+32); void t2(int x1,int x,int y) /*绘制第二幅图形*/ line(0,y/2+72,x,y/2+72); circle(x1+40,y/2,10); line(x1+40,y/2+10,x1+28,y/2+50); line(x1+28,y/2+52,x1+11,y/2+47); line(x1+30,y/2+40,x1+52,y/2+50); line(x1+52,y/2+50,x1+42,y/2+70); line(x1+39,y/2+11,x1+24,y/2+22); line(x1+24,y/2+22,x1+34,y/2+32); line(x1+39,y/2+11,x1+45,y/2+30); line(x1+45,

温馨提示

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

评论

0/150

提交评论