收藏 分销(赏)

计算机图形学实验指导书--xhp.doc

上传人:快乐****生活 文档编号:2125341 上传时间:2024-05-16 格式:DOC 页数:56 大小:1.18MB 下载积分:14 金币
下载 相关 举报
计算机图形学实验指导书--xhp.doc_第1页
第1页 / 共56页
计算机图形学实验指导书--xhp.doc_第2页
第2页 / 共56页


点击查看更多>>
资源描述
个人收集整理 勿做商业用途 《计算机图形学》 实 验 指 导 书 软件学院 软件理论系 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 52 -- 实验要求及实验报告规范 一、实验的性质、目的和任务 本实验是与本专业课《计算机图形学》相配套的,通过计算机图形学实验教学,引导学生由浅入深地掌握计算机图形学理论与相关算法,具有一定实践体会和相关的编程能力及图形处理的能力,为毕业设计和毕业后从事计算机绘图、计算机辅助设计、辅助教学、辅助工程、图形处理等打下基础。 本实验教学主要内容是要求学生编程实现各种图形的绘制,强化学生的程序设计能力和程序调试能力,使学生巩固所学各种图形的生成算法的理论知识。 二、实验基本要求 实验基本要求: 本实验教学的基本要求是: ① 实验课前,学生必须预习实验指导书中的实验内容,了解本次实验的目的、要求、原理、算法、步骤等,准备好实验的程序设计算法描述与关键分析内容; ② 准备好程序和测试数据,上机调试、运行; ③ 完成每个实验后进行结果对比分析,完成实验报告。 实验内容要求: (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 here drawMode=2; //设置为绘制直线模式 } (2)新增成员变量 CPoint p1; (3)修改OnLButtonDown以及OnMouseMove函数的代码: void CMy11View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default isDrag=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 default if(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生成算法思想如下(第一象限,且斜率k〈1的情况 图2—1 a中的1a): 1) 画点(x1,y1),dx=x2—x1,dy=y2—y1,计算误差初值P1=2dy—dx,i=1; 2) 求直线下一点位置 xi+1=xi+1 如果Pi>0,则yi+1=yi+1,否则 yi+1=yi; 3) 画点(xi+1,yi+1); 4) 求下一个误差Pi+1点,如果Pi〉0,则Pi+1=Pi+2dy—2dx,否则 Pi+1=Pi+2dy; 5) i=i+1,如果i<dx+1则转步骤2,否则结束操作. Bresenham生成算法的优点如下; 1)不必计算直线的斜率,因此不做除法。 2)不用浮点数,只用整数。 3)只做整数加减运算和乘2运算,而乘2运算可以用移位操作实现。 Bresenham算法的速度很快,并适于用硬件实现. 对于图2-1 a中的2a,只需将xi+1=xi+1改为xi+1=xi-1. 对于图2—1 a中的1b,斜率k〉1的情况,可交换变量x和y,y每次长1个单位.对Pi进行判断,xi+1=xi或xi+1=xi+1。 2、有关圆弧生成算法有:逐点比较法、DDA(数值微分)直线算法、圆的Bresenham生成算法。 圆的生成算法一般将圆划分为8等份,只需计算(900,450)的八分之一圆弧,其它用对称法求得(参见图2-1 b). Bresenham生成算法思想如下(第一象限,且斜率k〈1的情况): 1) 计算误差初值P1=3—2r,i=1,画点(0,r); 2) 求下一个光栅点位置 xi+1=xi+1 如果Pi〈0,则yi+1=yi,否则 yi+1=yi-1; 3) 画点(xi+1,yi+1); 4) 求下一个误差Pi+1点,如果Pi<0,则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、熟悉各种直线裁剪算法,包括Cohen-Sutherland线段裁剪算法,中点分割线段裁剪算法,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’(x’i,y’i ,z’i),其变换公式为: [x’ y’ z’ 1] =[x y z 1]•T 对于不同的变换,都是用矩阵乘法来计算坐标,只需改变变换矩阵即可。因此对每一种坐标变换可编成一个子程序。 2、 变换后的三维点并不能直接在二维屏幕上绘制出来,必须用到前一个实验的内容,选用一个轴测投影,将三维点经过轴测投影变换后,得出P*(x*i,y*i ,z*i) [x* y* z* 1] =[x’ y’ z’ 1]•T正等测 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)个空间点列,则m×n次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从现0~1分成m等分,把v从现0~1分成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-05 3、孙家广、胡事民,《计算机图形学基础》, 清华大学出版社,2011—07 4、潘云鹤等, 《计算机图形学——原理、方法及应用(第3版) 》, 高等教育出版社,2011-6 5、孙家广,计算机图形学(第三版),清华大学出版社,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 <graphics。h〉 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) maxx maxy 图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的调用格式为
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 应用文书 > 技术指导

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服