计算机图形学实验报告

计算机图形学

实验报告

学号:

姓名:

班级:计算机 2班

指导老师:何太军

2010.6.19

实验一、Windows 图形程序设计基础

1、实验目的

1)学习理解Win32 应用程序设计的基本知识(SDK 编程);

2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。

4)学习MFC 类库的概念与结构;

5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框);

6)学习使用MFC 的图形编程。

2、实验内容

1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。(可选任务)

2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,This

is my first SDI Application"。(必选任务)

3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。

3、实验过程

1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档;

2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,This

is my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制;

3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。

4、实验结果

正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。成功地完成了实验。

结果截图:

5、实验体会

通过实验一,了解了如用使用基本的SDI编程函数绘制简单的图

形,如:在指定的位置输出字符串以及基本图形线,圆,方形的绘制。同时,初步认识了,MFC编程,了解了一些MFC的结构,和如何进行窗口编程的知识。

实验二、基本图形生成算法(GDI/MFC)

1、实验目的

1)学习理解Win32 应用程序设计的基本知识(SDK 编程);

2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。

4)学习MFC 类库的概念与结构;

5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框);

6)学习使用MFC 的图形编程。

2、实验内容

1) 使用MFC AppWizard 建立一个SDI程序,从CClientDC中

派生一个类,添加图绘制算法处理函数:DDA画线、Bresenham

画线,要求能绘制任意斜率的直线段;添加中点画圆函数,

要求能绘制圆心在任意位置的圆;添加边界表示区域和内点

表示区域的种子填充算法。

2) 自定义定义图形数据结构Point\Line\Circle\Polygon等

保存一些简单图形数据(在文档类中),验证以上基本图形

算法:画若干条线段;若干个圆,并以圆作为区域验证种

子填充算法;绘制多边形并填充。

3) 学习数据序列化(串行化),实现将自定义类中的数据保存

到自定义文件中:Point等类从CObject派生(参考 VC

经典教程第7 章),重载Serialize函数。

3、实验过程

1)用MFC(exe)建立一个单文档工程;

2)在类视图中的DrawDC类中根据教材上的代码添加相应的DDA 画线算法函数,Bresenham画线算法函数,中点画圆函数,边界表示区域和内点表示区域的种子填充算法函数,以供DView 类中的OnDraw()函数来调用;

3)自定义circle_2,line_2,point_2类来保存基本的图形数据4)在OnDraw()函数里调用不同的画线、画圆算法来绘制直线、圆、多边形、曲线等基本图形,调用填充算法函数,用来填充多边形和圆。

5)修改Point为point_resister类,从CObject 派生,并且重载Serialize 函数,Serialize 函数函数体根据不同的成员变量实现数据的保存。

6)在OnDraw()函数里调用直线的Serialize 函数,实现直线数据的串行化,保存数据到指定文件里

4、实验结果

通过输入教材上的代码,能成功地实现相应的算法功能。通过

在OnDraw()中调用不同的函数,实现了相应的线,圆,多边形的绘制,并成功地实现图形的填充。

结果截图:

5、实验体会

通过实验二,更透彻的理解了课本上的DDA画线算法和Bresenham 画线算法,中点画圆函数,边界表示区域和内点表示区域的种子填充等算法学习了如何自定义类来存贮简单的图形数据,类的派生和函数的重载,数据的串行化及保存数据到指定的文件,初步认识了MFC中的文档类,学习了一些相关的内容。进一步的了解的MFC的结构与编程方法。

实验三、 OpenGL图形程序设计基础

1.实验目的

1)了解OpenGL 图形库的功能和结构;

2)学习使用Visual C++ 开发基于控制台的图形程序;

3)学习使用Visual C++ 开发基于单文档(GUI 界面)的图形程序。

4)学习使用OpenGL 生成基本图形;

5)学习使用OpenGL 实现图形变换;

2.实验内容

1)使用Visual C++建立一个Win32 Console Application(控制台应用程序),定义若干点坐标,绘制点、线段、不闭合折线、闭合折线、多边形、三角形、四边形、三角扇、三角条带、四边形条带。尝试不同尺寸的点、不同线宽的线、设置颜色等操作。

2 )使用MFC AppWizard 建立一个SDI 程序,根据参考资料2 和3中的步骤设置OpenGL 图形绘制环境。增加绘制4种基本图形(选择其中之一)。

3.实验过程:

1)建立一个控制台应用程序,在RenderScene()函数中调用不同的系统函数分别绘制不同属性的点、线、折线、多边形、扇形等;

2)建立一个SDI程序,按照所给资料设置OpenGL图形绘制环境,并照敲老师所给实列,观看结果,查看关键代码区;

3)仿照所给列子,改写代码,绘制彩色的正方体;

4.实验结果

基本图形显示正确

基本图形截图:

三棱柱截图:

5.实验体会

在实验过程中,在工程的设置里面一定要把相关的库文件导入,设置正方体坐标时,要根据画布的坐标来,设置好图形的坐标比较重要,这将影响这图形显示的效果。通过这个实验,掌握了许多新图形的画法,同时,通过仿照所给列子,改写代码,绘制彩色的正方体,我也初步认识了绘制立体图形的一些内容,希望在今后的试验中可以

了解更多。

实验四、二维图形变换程序设计

1.实验目的:

1)掌握图形变换实现原理,基本几何变换,复合变换等;

2)学习使用Visual C++开发菜单,对话框等交互界面的设计;

3)学习使用MFC单文档程序,实现二维图形的基本几何变换。2.实验内容:

使用Visual C++建立一个单文档程序,采用实验二中定义的基本图形类。在程序中增加图形变换菜单(各基本变换对应菜单项),各图形变换的参数通过对话框提供(设计提供变换参数的对话框,如平移,旋转,比例等),实现二维图形的变换。(提示:在各个图形类中增加相应的成员函数实现平移;菜单选择变换弹出对应变换的参数对话框,对话框中提供参数后取出参数传递给图形对象,通过调用图形变换成员函数实现图形对象的变换)。要求实现直线段、圆、多边形等基本图形的几何变换。

3.实验过程:

(1).根据实验要求,新建菜单,增加二维图形变换子菜单,然后在菜

单上添加平移,比例,对称,旋转以及错切选项。

(2).对菜单中的每一项方法构造响应函数,并给几个需要弹出对话框的选项添加对话框响应函数。

(3).在弹出的对话框输入参数,获取输入的参数,调用相应的变换函数,实现图形的变换。

4.实验结果:

结果正确。

平移xy(100, 0)

5.实验体会:

在这次实验中,涉及到了,菜单和对话框的操作,在vc++6.0中,是非常方便的,VC++6.0都提供了向导型的操作过程和可视化的控件添加,这样节省了代码编写量。通过实验四,进一步加深了对MFC编

程的认识,也学习了如何对二维图形进行各种变换操作。

实验五、三维图形变换程序设计

1.实验目的:

1)掌握三维图形变换实现原理,基本几何变换,复合变换,投影变换等;

2)学习使用Visual C++ 开发菜单,对话框等交互界面的设计;

3)学习使用OpenGL实现图形模型变换,视图变换,投影变换。

4)学习使用OpenGL 生成基本图形;

2.实验内容:

1)使用MFC AppWizard建立一个SDI 程序,根据参考资料2和3中的步骤设置OpenGL图形绘制环境。增加绘制如下图形(选择其中任意两个),注意模型坐标系的选择和顶点坐标的计算。(可直接使用实验三的设计)。

2)在程序中增加图形变换菜单(各个基本变换对应菜单项),各图形变换的参数通过对话框提供(设计提供变换参数的对话框,如平移,旋转,比例等),实现三维图形的基本几何变换(提示:菜单选择变换弹出对应变换的参数对话框,对话框中提供参数)。尝试改变投影参数与观察参数,实现图形的投影变换。

3.实验过程:

(1).根据实验要求,首先建立变换菜单,在菜单上提供平移,比例,

旋转等变换方法。

(2).对菜单中的每一项方法构造响应函数,弹出对话框

(3).通过弹出的对话框进行参数输入,并获取输入的参数,调用相应的变换函数,实现图形的变换。

4.实验结果:

如压缩文件中Debug文件夹的EXE程序所示:

按下平移,输入X,Y,Z轴的平移参数,得出新绘制的图形;

按下比例,输入比例系数,得到新绘制的图形;

按下旋转,首先输入想要绕某点旋转的,该点的坐标,再输入所要旋转的角度,得出新绘制的图形;

原始图形:

平移过后:

比例放大过后:

旋转后:

5.实验体会:

通过实验五,可以熟练的使用菜单完成各种相应的操作,同时,在上个实验,学习二维图形变换的基础上,学习了如何对三维图形进行变换操作,进一步完善了对于图形变换的学习。

实验六、OpenGL真实感图形程序设计

1.实验目的:

1)掌握真实感图形生成的基本原理,如消隐,光照,材质等知识;

2)学习使用OpenGL,GLUT等生成基本图形,如球体,正方体,

茶壶等;

3)学习使用OpenGL生成各种光源:点光源,平行光,聚光灯等;

4)学习使用OpenGL 设置绘制对象的颜色,材质;

5)进一步熟悉OpenGL图形变换技术:几何变换,视图变换,观察变换等:

(1).对模型实现各种几何变换,包括对glTranslate,glRotate,glScanglLoadMatrix,glMultMatrix,等使用;

(2).视口变换,测试不同大小的视口glViewport;

(3).投影变换,要对平行投影与透视投影分别测试,使用不同的观察体参数,观察

效果;

2.实验内容:

使用MFC AppWizard建立一个SDI程序,根据参考资料2和3中的步骤设置Opengl图形绘制环境。增加绘制如下图形,球体或茶壶等(使用glut函数)。环境中创建点光源,平行光,聚光灯。设置所绘制对象的材质,呈现出塑料,金属等材质特性,对官员的位置,方向,类别进行控制,改变材质参数,观察效果。

3.实验过程:

1).根据以前设置好的OpenGL图形绘制参数,在实验3的绘制正方

体的基础上修改程序,绘制1个全红的正方体;

2).建立一个设置光源的函数,进行光源的各种参数的设置;

3).设置好各个光源参数后,调用函数开启光源,此时的正方体轮郭清晰,显得很真实;

4.实验结果:

绘制了1个全红的正方体,设置的光源,并且向光部分亮,背光部分相对而言显得黯淡。

5.实验体会:

实验六通过使用openGL的相关函数,绘制出立体图形。并设置三维图形的材质、光源,调整一定的系数使图形更真的显示。此次学到了,如何使用openGL绘制一个比较真实的三维物体,进一步了解的图形学中三维图形的处理方式,结合课堂中内容,对三维图形有了更深入的理解。

实验七、二维交互式图形程序设计

1、实验目的:

1)综合使用VC++编写Win32 应用的方法(单文档、多文档、对话框);

2 )掌握交互式绘图程序设计及MFC 相关类的使用;

3)掌握使用MFC 的编写简单动画程序。

2、实验任务:

1)使用MFC AppWizard 建立一个SDI 程序。综合前几次二维绘图

实验的结果,实现基本功能:

建立绘制点、直线段、圆、椭圆、圆弧、多段线(折线)、多边形、贝塞尔(Bezier )曲线的相关类(对于封闭图形,应能多种方式填充)、字符串。使用实验二中自定义的CClientDC 的派生类,实现交互式(鼠标)绘制以上图形。实现颜色、线型、字体等的交互式选择,实现除曲线、圆弧外其他图形的鼠标拾取(框选、点选)。

实现新建文件、保存文件,打开文件(打开保存的自定义图形文件,并绘制图形)。

软件界面设计(工具栏、菜单、光标等)。

可选扩展功能:

(1)实现平移、旋转、缩放、对称、错切等图形几何变换

(2)图形的显示控制包括缩放(按比例、选取框)、平移(上、小、左、右)。

(3)实现图层功能(可见性、颜色、锁定等)、图块功能(及选中

多个图形形成一组,图块的生成、引用、编辑)。

(4 )图形的显示控制包括实时缩放、实时平移和定点平移等。(5)图形的编辑控制包括撤销、重复、剪切、复制、粘贴、删除、清除。

2 )本任务是在以上程序的基础上,增加动画功能(可单独增加相应菜单):

交互式绘制三个圆作为太阳、地球、月球(要求填充,注意位置。数据放入文档类,即文档类有变量太阳、地球、月球等),实现二维动画:月球绕地球转、地球自转(地球采用图案填充)、地球绕太阳公转(按时间比例,可设置参数:时间、颜色、调整大小)。3、实验过程:

1)建立绘制点、直线段、圆、椭圆、圆弧、多段线(折线)、多边形、贝塞尔(Bezier )曲线的相关类

2)在菜单栏上增加相应的菜单,用来选择不同的功能

3)对增加的菜单栏设置ID,并且在View类中添加相应的事件响应函数,在各自的响应函数中实现各自的功能

4、实验结果:

基本功能:

扩展功能(做一个简单的太阳系):

在附加功能中,点击“开始”图形开始变换,点击“停止”图形静止。

5、实验体会:

通过这次实验,学习了交互式绘图程序设计,更深入认识了MFC 相关类的使用,完善了自己对MFC编程的认识体系,也熟悉了如何进行图形学中的交互式设计,此次实验综合了以前的许多知识,更为深入的认识了交互式绘图程序设计。对自己的提高也是非常大的。计算机图形学做了七个实验,做了实验之后收获很多,结合课堂上老师的讲解,对计算机图形学从许多方面都有了一定的理解。对更加深入学习计算机打下比较好的基础。

计算机图形学实验报告

计算机图形学 实验报告 学号: 姓名: 班级:计算机 2班 指导老师:何太军 2010.6.19

实验一、Windows 图形程序设计基础 1、实验目的 1)学习理解Win32 应用程序设计的基本知识(SDK 编程); 2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。 4)学习MFC 类库的概念与结构; 5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框); 6)学习使用MFC 的图形编程。 2、实验内容 1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。(可选任务) 2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,This is my first SDI Application"。(必选任务) 3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。 3、实验过程

1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档; 2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,This is my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制; 3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。 4、实验结果 正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。成功地完成了实验。 结果截图: 5、实验体会 通过实验一,了解了如用使用基本的SDI编程函数绘制简单的图

《计算机图形学》实验报告

实验报告模板 《计算机图形学》实验报告 一、实验目的及要求 1.实习三维图形的坐标系之间的变换; 2.三维图形几何变换; 3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等); 二、理论基础 在齐次坐标理论下,二维图形几何变换矩阵可用下式表示: ? ? ? ? ? ? ? = = = i f c h e b g d a T n k x x k k 2,1,0 , ) ( ? 平移变换:[x* y* 1] =[x y 1] * 00 00 001 t s ?? ? ? ? ??=[t*x s*y 1] 比例变换:[x* y* 1]=[x y 1] * 100 010 1 m n ?? ? ? ? ??=[m+x n+y 1] 旋转变换:在平面上的二维图形饶原点逆时针旋转?角,变换矩阵为 [x* y* 1]=[x y 1] * cos sin0 sin cos0 001 θθ θθ ?? ? - ? ? ??= [x*cos?-y*sin?] 复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。 三维变换类似于二维,在画图时,把三维坐标转换为二维即可。 三、算法设计与分析 二维变换: #define dx 50 #define dy 100 void CCGWithVCView::OnTransScale() //平移(50,100) { // TODO: Add your command handler code here // AfxMessageBox(_T("Please Insert The Move Change Code!")) ; int m[4][2]={{100,50},{50,100},{150,100},{100,50}}; int i; int a[2],b[2];

计算机图形学实验报告

计算机图形学 实验报告 实验一:二维线画图元的生成 实验目的:掌握直线段的生成算法,并用C/WIN-TC/VC++实现算法,包括中点法生成直线,微分数值法生成直线段等。 实验内容:用不同的方法生成斜率不同的直线段,比较各种方法的效果。 Bresenham 算法的思想 Bresenham 画法与中点法相似,都是通过每列象素中确定与理想直线最近的像素来进行直线的扫描的转换的。通过各行、各列的象素中心构造一组虚拟网格线的交点,然后确定该列象素中与此交点最近的像素。该算法的巧妙之处在于可以采用增量计算,使得对于每一列,只需要检查一个误差项的符号,就可以确定该列的所有对象。 1.1方法一:直线的中点算法 算法的主要思想: 讨论斜率k ∈[1,+∞)上的直线段的中点算法。 对直线01p p ,左下方的端点为0p (x0,y0),右上方的端点为1p (x1,y1)。直线段的方程为: y m x B =+ ?y y x B x y y x x B x ?= +??=?+?? (,)0F x y xy yx xB ?=?-?-?= 现在假定已求得像素(,,i r i x y ),则如图得

,,11(,]22 i i r i r x x x ∈- + 由于直线的斜率k ∈[1,+∞),故m=1/k ∈(0,1],则 1,,13(,]22i i r i r x x x +∈-+ 在直线1i y y =+上,区间,,13 (,]22i r i r x x -+内存在两个像素NE 和E 。根据取整原则,当 11(,)i i x y ++在中点M 11 (,)2 i i x y ++右方时,取像素NE ,否则取像素E ,即 ,11,,1()()01()()0 i r i i r i r i x E F M x x x NE F M x +++? ?≤=? +?>?i i 点当(,y +1)在左方时点当(,y +1)在右方时 若取2()i d F M =,则上式变为 ,1,,()01(0 i r i i r i r i x E d x x NE d +? ≤=? +>?点当点)当 计算i d 的递推公式如下: ,1 1,12[(2)()]012 2(,2)0 122[(2)(1)] 2 i i r i i i i i i i r x y y x xB d d F x y d x y y x xB ++? ?+-?+-??≤?=++=? >??+-?++-??? =202() i i i i d x d d x y d +?≤?? +?-?>? 算法的初始条件为: 00,00,0(,)(0,0)1 2(,1)22 r r x y x y d F x y x y =? ? ?=++=?-??? 相应的程序示例: 建立成员函数: void MidPointLine4(CDC*pDC,int x0,int y0,int x1,int y1,int color) { /*假定x01*/ int dx,dy,incrE,incrNE,d,x,y; dx=x1-x0; dy=y1-y0; d=2*dx-dy; incrE=2*dx; incrNE=2*(dx-dy); x=x0;y=y0; pDC->SetPixel(x,y,color); while (x

计算机图形学实验报告及代码

计算机图形学实验报告及代码 第 1 章概述 一、教学目标 通过本章的学习,使学生能够了解计算机图形学的基本概念、研究内容;当前的发展概况;本门课程的特点和应用。 二、教学要求 1.了解计算机图形学的概念和研究内容; 2.了解本门课程的发展概况。 三、教学内容提要 1. 计算机图形学的研究内容 2. 计算机图形学发展概况 3. 计算机图形学特点和应用 4. 计算机图形学当前研究的课题 5. 计算机图形生成和输出的流水线 四、教学重点、难点及解决方法 本章将主要围绕计算机图形学的基本概念进行介绍,介绍研究内容;当前的发展概况;本门课程的特点和应用等等。 五、课时安排 2学时 六、教学设备 多媒体 七、检测教学目标实现程度的具体措施和要求 通过课堂提问的方式来检测学生对基本概念的掌握程度。 八、教学内容 1.1 计算机图形学的研究内容 计算机图形学(Computer Graphics): 研究通过计算机将数据转换为图形,并在专用显示设备上显示的原理、方法和技术的学科。 计算机图形表现形式 (1).线条式(线框架图)

用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。 (2).真实感面模型图形 跑车靓照 计算机图形分类(空间) (1).二维图形(2D):在平面坐标系中定义的图形 (2).三维图形(3D):在三维坐标系中定义的图形 计算机图形产生方法 (1).矢量法(短折线法) 任何形状的曲线都用许多首尾相连的短直线(矢量)逼近。 (2).描点法(像素点串接法) 每一曲线都是由一定大小的像素点组成 计算机绘图方式: (1)交互式绘图 允许操作者以某种方式(对话方式或命令方式)来控制和操纵图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。如AUTOCAD等 (2)被动式绘图 图形在生成过程中,操作者无法对图形进行操作和控制。如C语言绘图 图形的操作与处理方法(Picture Manipulation) 如图形的开窗、裁剪、平移、旋转、放大、缩小、投影等各种几何变换操作的方法及其 软件或硬件实现技术。 图形信息的存储,检索与交换技术:如图形信息的各种表示方法、组织形式、存取技术、图形数据库的管理、图形信息通信等。 人机交互及用户接口技术:如新型定位设备、选择设备的研究;

计算机图形学实验报告(一).doc

实验一OpenGL开发环境及扫描转换算法 1、实验目的与要求 1.通过实验掌握OpenGL中编程环境的设置,了解相关函数用途及设置步骤; 2.通过实验掌握基本图形元素的生成,给出相关代码和运行结果; 3.用WINDOWS GDI函数编写生成直线或区域填充的程序(选DDA或Bresenham直线算法,活 性边表算法填充多边形),演示算法过程。 4.画矩形,调用一个函数画一个矩形。画椭圆,调用一个函数画一个椭圆。画Bezier 曲线。 2、实验方案 请描述为达到实验的需要完成哪些方面的实验,列举出实验的基本要点和重点。 在工程WinAPIEX加入void createLine(HDC tmpDC)和void Polyline (tmpDC) 在void createLine(HDC tmpDC)用DDA直线算法或Bresenham直线算法生成直线 在void Polyline (tmpDC)添加活泩边表填充算法,生成填充四边形和八边形 加入Rectangle(tmpDC,x0,y0,x1,y1);加入Ellipse (tmpDC, x0,y0,a,b) ;加入PolyBezier(tmpDC,arr_vertex,4) ; 3、实验结果和数据处理 1)生成直线的DDA直线算法 在createLine(tmpDC)中加入以下代码int x0,y0,x1,y1,color; //自定义直线的起点(x0,y0)和终点(x1,y1),及颜色color float dx,dy,x,y; int length,i; x0=50; y0=160; x1=900; y1=200;//此处修改了 color=1000; color=1; if(abs(x1-x0)>=abs(y1-y0)) length=abs(x1-x0); else length=abs(y1-y0); dx=(x1-x0)/(float)length; dy=(y1-y0)/(float)length; i=1; x=(float)x0; y=(float)y0; while(i<=length) { SetPixel(tmpDC,int(x+0.5),int(y+0. 5),color); x+=dx; y+=dy; i++; } 2)区域填充的程序 在void Polyline (tmpDC) 添加活性边表填充 void Polyline (HDC tmpDC) //多边形边数. { const int POINTNUM=4;//或者是八边形8 /******定义结构体用于活性边表AET

计算机图形学实验报告实验2裁剪算法实验

一、实验目的: 直线段的裁剪:编码裁剪算法,中点分割裁剪算法。 二、实验内容: //BasicGraph.cpp //请将下列裁剪程序补充完整,并用注释说明是何种裁剪算法 void Encode (int x,int y,int *code,int XL,int XR,int YB,int YT) { //请将此程序补充完整 int c=0; if(xXR) c=c|RIGHT; if(yYT) c=c|TOP; (*code)=c; } //编码裁剪算法: void C_S_Line(POINT &p1,POINT &p2,int XL,int XR,int YB,int YT) { //请将此程序补充完整 int x1,x2,y1,y2,x,y,code1,code2,code; x1=p1.x; x2=p2.x; y1=p1.y; y2=p2.y; Encode(x1,y1,&code1,XL,XR,YB,YT); Encode(x2,y2,&code2,XL,XR,YB,YT); while(code1!=0||code2!=0) { if((code1&code2)!=0) return; code=code1; if(code1==0) code=code2; if((LEFT&code)!=0) {x=XL;y=y1+(y2-y1)*(XL-x1)/(x2-x1);} else if((RIGHT&code)!=0) {x=XR;y=y1+(y2-y1)*(XR-x1)/(x2-x1);} if((BOTTOM&code)!=0) {y=YB;x=x1+(x2-x1)*(YB-y1)/(y2-y1);} else if((TOP&code)!=0) {y=YT;x=x1+(x2-x1)*(YT-y1)/(y2-y1);} if(code==code1) {x1=x;y1=y;Encode(x,y,&code1,XL,XR,YB,YT);} else {x2=x;y2=y;Encode(x,y,&code2,XL,XR,YB,YT);} }

计算机图形学实验报告

计算机图形学实验报告 计算机图形学实验报告 引言 计算机图形学是研究计算机生成和处理图像的学科,它在现代科技和娱乐产业中扮演着重要的角色。本实验报告旨在总结和分享我在计算机图形学实验中的经验和收获。 一、实验背景 计算机图形学实验是计算机科学与技术专业的一门重要课程,通过实践操作和编程,学生可以深入了解图形学的基本原理和算法。本次实验主要涉及三维图形的建模、渲染和动画。 二、实验内容 1. 三维图形建模 在实验中,我们学习了三维图形的表示和建模方法。通过使用OpenGL或其他图形库,我们可以创建基本的几何体,如立方体、球体和圆柱体,并进行变换操作,如平移、旋转和缩放。这些基本操作为后续的图形处理和渲染打下了基础。 2. 光照和着色 光照和着色是图形学中重要的概念。我们学习了不同的光照模型,如环境光、漫反射和镜面反射,并了解了如何在三维场景中模拟光照效果。通过设置材质属性和光源参数,我们可以实现逼真的光照效果,使物体看起来更加真实。3. 纹理映射 纹理映射是一种将二维图像映射到三维物体表面的技术。通过将纹理图像与物

体的顶点坐标相对应,我们可以实现更加细致的渲染效果。在实验中,我们学 习了纹理坐标的计算和纹理映射的应用,使物体表面呈现出具有纹理和细节的 效果。 4. 动画和交互 动画和交互是计算机图形学的重要应用领域。在实验中,我们学习了基本的动 画原理和算法,如关键帧动画和插值技术。通过设置动画参数和交互控制,我 们可以实现物体的平滑移动和变形效果,提升用户体验。 三、实验过程 在实验过程中,我们首先熟悉了图形库的使用和基本的编程技巧。然后,我们 按照实验指导书的要求,逐步完成了三维图形建模、光照和着色、纹理映射以 及动画和交互等任务。在实验过程中,我们遇到了许多挑战和问题,但通过不 断的尝试和调试,最终成功实现了预期的效果。 四、实验结果 通过实验,我们成功实现了三维图形的建模、渲染和动画效果。我们可以通过 键盘和鼠标控制物体的移动和变形,同时观察到真实的光照效果和纹理映射效果。实验结果符合预期,并且在实验报告中附上了实验截图和代码片段供参考。 五、实验总结 通过本次计算机图形学实验,我深入了解了三维图形的建模和渲染原理,掌握 了OpenGL等图形库的使用方法。同时,我也学会了如何应用光照、纹理映射 和动画等技术,使图形更加真实和生动。通过实验,我不仅提升了编程能力, 还培养了团队合作和问题解决的能力。 六、展望未来

计算机图形学报告

沈阳航空航天大学 计算机图形学实验报告 班级:34140102学号:20130 姓名:成绩: 指导教师: 实验一:OpenGL绘制球体线框图 1.实验目的: 本实验要求熟悉OpenGL基本图元函数的使用。 通过使用OpenGL及GLUT库在Visual C++环境下编写图形绘制程序掌握图形绘制的一般框架,从而为进一步做综合性的图形绘制实验奠定基础 2.实验要求: 编写一个程序,在窗口中显示一个旋转的球体线框,利用光标键可启动图形旋转切换视点。 3.实验过程: 先配置环境,把相关文件放到相应的文件夹 C:\Program Files\Microsoft Visual Studio\VC98\Include\GL C:\WINDOWS\system32 C:\Program Files\Microsoft Visual Studio\VC98\Lib 建一个新工程,比照pdf敲代码 再通过VC++进行编译

4.实验结果: 程序运行后,弹出窗口,使用光标键可使球体旋转。 代码:include #include #include #include #include void init(); void CALLBACK reshapae(GLsizei w,GLsizei h); void CALLBACK display(); GLfloat s, h; //回调函数,绘制窗口时调用 void CALLBACK display() { //清空窗口设置背景为白色 glClearColor(1, 1, 1, 1); glClear(GL_COLOR_BUFFER_BIT);

计算机图形学报告

. . . . . . . 优质资料 . . 计算机图形学 (2017年秋季学期) 实 验 报 告 系别:计算机科学与技术 班级: : 学号: 实验名称:2-真实感图形绘制

2020-11-13 2/3 《计算机图形学》实验报告 实验名称 真实感图形绘制 实验序号 2 实验日期 2017.12.13 实验人 一、实验目的、要求与环境 1.目的:通过实验,学生应掌握通过计算机程序进行真实感图形绘制的基本原理,特别是对三维显示对象进行纹理映射的基本方法,将理论和实际应用切实结合起来。 2.要求:对一个三维立方体进行旋转,对其6个不同的面进行6个不同图像的纹理映射,并进行投影变换与显示,分析增强后的视觉效果,提交实验报告。 3.环境:Windows 7操作系统 Microsoft Visual Studio 2005 OpenGL 函数库 4. 自带位图文件(换成你自己的图像文件): 总成绩: 评语: 日期:

2020-11-13 11/12 二、实验容与步骤 1. 准备相关图像文件。 2. 进行立方体各面图像与旋转速度的大体设计。 3.在Windows 7 操作系统上,打开Microsoft Visual Studio 2005,编写相关程序,完成程序主体框架结构。 4.编写六面体显示相关的程序代码。 5.编写六面体旋转相关的程序代码。 6.编写深度检测相关的程序代码。 7. 编写纹理载入功能的相关程序代码。 8. 编写纹理参数定义功能的相关程序代码。 9. 编写纹理映射功能的相关程序代码。 10.对程序进行相关调试,修改程序,去除其中的BUG 。 11. 观察纹理映射后的六面体的旋转显示,与预想的结果进行对比,修改相关程序参数。 12.截屏,保留实验结果,进行实验结果分析,并撰写实验报告。

计算机图形学-实验五直线和多边形的裁剪

大学实验报告 学院:计算机科学与信息学院专业:软件工程班级:102班 ** 实验组实验时间指导教师成绩实验工程名称实验五直线和多边形的裁剪 实 验 目 的 掌握直线段的裁剪算法以及多边形的裁剪算法 实 验要求熟练掌握直线段的裁剪算法以及多边形的裁剪算法的根本原理,并编写测试代码进展实验。 实验原理 Cohen-Sutherland直线剪裁算法 以区域编码为根底,将窗口及其周围的,8个方向以4 bit的二进制数进展编码。 右图所示的编码方法将窗口及其邻域 分为5个区域: ⑴域:区域(0000)。 ⑵上域:区域(1001, 1000, 1010)。 ⑶下域:区域(0101, 0100, 0110)。 ⑷左域:区域(1001, 0001, 0101)。 ⑸右域:区域(1010, 0010, 0110)。 当线段的两个端点的编码的逻辑"与〞非零时,线段为显然不可见的,对*线段的两个端点的区号进展位与运算,可知这两个端点是否同在视区的上、下、左、右; Cohen-Sutherland直线剪裁算法的算法思想是: 对于每条线段P1P2分为三种情况处理。〔1〕假设P1P2完全在窗口,则显示该线段P1P2简称"取〞之。〔2〕假设P1P2明显在窗口外,则丢弃该线段,简称"弃〞之。〔3〕假设线段既不满足"取〞的条件,也不满足"弃〞的条件,则在交点处把线段分为两段。其

while (code1 != 0 || code2 != 0) { if ((code1 & code2) != 0) {// 两端点的编码相与不为0,表示直线在窗口外return; } if (code1 != 0) { code = code1; } else { code = code2; } if ((LEFT & code) != 0) {// 直线的端点与矩形窗口的左边编码相与!=0 * = *L; y = y1 + (y2 - y1) * (*L - *1) / (*2 - *1);// 求直线与矩形窗口的左边界的交点 } elseif ((RIGHT & code) != 0) {// 直线的端点与矩形窗口的右边编码相与!=0 * = *R; y = y1 + (y2 - y1) * (*R - *1) / (*2 - *1);// 求直线与矩形窗口的右边界的交点 } elseif ((BOTTOM & code) != 0) {// 直线的端点与矩形窗口的下边编码相与!=0 y = YB; * = *1 + (*2 - *1) * (YB - y1) / (y2 - y1);// 求直线与矩形窗口的下边界的交点 } elseif ((TOP & code) != 0) {// 直线的端点与矩形窗口的上边编码相与!=0 y = YT; * = *1 + (*2 - *1) * (YT - y1) / (y2 - y1);// 直线的端点与矩形窗口的上

cohensutherland裁剪算法实验报告

cohensutherland裁剪算法实验报告 Cohen-Sutherland裁剪算法是一种用于计算机图形学中线段裁剪的算法。该算法用于确定一个给定的线段是否跨越了一个裁剪窗口,并且在必要的情况下将该线段裁剪到窗口内。Cohen-Sutherland算法是一种基于二进制编码的线框裁剪算法,其运算速度很快,广泛应用于计算机图形学中。 实验内容: 本次实验主要内容是使用Cohen-Sutherland裁剪算法对线段图形进行裁剪。具体实验过程如下: 1. 对于给定的线段和裁剪窗口,首先需要对线段进行编码。 2. 判断线段是否在裁剪窗口内。如果线段的两个端点都在裁剪窗口内,则该线段完全位于裁剪窗口内,不需要进行裁剪。 3. 如果线段的两个端点都在裁剪窗口外,则该线段完全位于裁剪窗口外,在此情况下可以直接将该线段丢弃。 4. 如果线段的一个端点在裁剪窗口内,而另一个端点在裁剪窗口外,则需要对该线段进行裁剪。

5. 根据线段的编码,在裁剪窗口的不同区域内确定该线段与裁剪窗口的相交点。 6. 在裁剪窗口内,将线段裁剪到与裁剪窗口相交的部分,并输出裁剪后的线段。实验步骤: 本次实验使用Python语言编写程序,具体代码实现如下: # 定义裁剪窗口的左,下,右,上位置 LEFT = 100 BOTTOM = 100 RIGHT = 500 TOP = 400 # 定义编码区域 INSIDE = 0 LEFT_EDGE = 1 RIGHT_EDGE = 2 BOTTOM_EDGE = 4 TOP_EDGE = 8

# 定义裁剪函数 def cohen_sutherland(x1, y1, x2, y2): # 对线段进行编码 code1 = encode(x1, y1) code2 = encode(x2, y2) accept = False while True: # 如果两端点都在裁剪窗口内 if code1 == INSIDE and code2 == INSIDE: accept = True break # 如果两端点都不在裁剪窗口内 elif (code1 & code2) != 0: break # 如果有一个端点在裁剪窗口内,但另一个端点不在 else: x = 0 y = 0 if code1 != INSIDE: code_out = code1 else:

计算机图形学实验报告

《计算机图形学》 实验报告 学号:0908610211 姓名:宋雪英 班级:计算机0961 项目: 1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。 2.利用方形、线性两种画刷来绘制圆和椭圆。 3.实现交互式二维图形的放缩,旋转和对称变换 2012年12月25日

基本图形的生成技术 一、实验目的 在一个图形系统中,基本图形(也称为图元、图素等)的生成技术是最基本的,任何复杂的图形都是由基本图形组成的,基本图形生成的质量直接影响该图形系统绘图的质量。所以,需要设计出精确的基本图形生成算法,以确保图形系统绘图的精确性。本次实验的目的就是利用Bresenham 算法和中心画线法两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。利用方形、线性两种画刷来绘制圆和椭圆。实现交互式二维图形的放缩,旋转和对称变换。 二、实验任务 1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。 2.利用方形、线性两种画刷来绘制圆和椭圆。 3.实现交互式二维图形的放缩,旋转和对称变换。 三、画直线的实验内容 任务一:利用其它两种画直线方法实现放大10陪显示方法交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。 1、设计思路 第一步:建立DDAMouseLine工程文件; 第二步:向视图类中添加自定义的成员变量 用鼠标右键单击视图类,选择“Add Member Variable…”,添加下面三个成员变量。 proctected : CPoint m_p1; //起点 CPoint m_p2; //起点 CPoint m_p; //点击鼠标时点的取值 第三步:向视图类中添加自定义的成员函数原型:

计算机图形学上机实验报告

北京工业大学计算机图形学上机实验报告 11070426 范元

多边形的填充 一、实验要求 用户输入顶点坐标序列,要求使用扫描线算法。 多边形顶点:(150,150,(190.200),(300,170),(1170,300)。 二、实验内容 1.根据多边形顶点坐标值,计算扫描线的最大值ScanMax和最小值ScanMin。 2.用多边形覆盖的扫描线动态建立桶结点。 3.循环多边形的所有顶点,根据边的终点y 值比起点y值高或边的终点y值比起点y值低两种情况(边的终点y值和起点y值相等的情况属于扫描线,不予考虑),计算每条边的yMin。在桶中寻找与该yMin 相应的桶结点,计算该边表的x|yMin、yMax、k(代表斜率倒数1/k),并依次连接该边表结点到桶结点。 4.对每个桶结点连接的边表,根据x|yMin值的大小进行排序,若 x|yMin相等,则按照k 由小到大排序。 5.对每个桶结点进行循环,将桶内每个结点的边表合并为有效边表,并进行有效边表循环。6.从有效边表中取出相邻两条边的交点对进行填充。填充时设置一个逻辑变量In(初始值为假),每访问一个结点,把In值取反一次,若In为真,则把从当前结点的x值开始到下一结点的x-1值结束的区间用指定颜色填充。(左闭右开) 7.循环下一桶结点,按照 xi+1=xi+k(k的值为1/k)修改有效边表,同时合并桶结点内的新边表,形成新的有效边表。 8.如果桶结点的扫描线值大于等于有效边表中某个结点的yMax值,则放弃该有效边表。9.当桶结点不为空则转5,否则删除桶结点和边结点的头结点,算法结束。 三、实验结果

四、实验体会 通过学习计算机图形学中的有效边表填充算法,进一步了解了扫描线算法的核心思想,并通过有效边表填充算法完成了实现。并且实现了了有效边表填充算法中的各种思想。加深了对计算机图形学的理解和对知识的掌握。 五、源程序 由于使用的是MFC工程,其中关于头文件以及边表的定义等不再具体给出。仅给出有效边表填充算法的部分。 void CTestView::PolygonFill()//多边形填充 { HeadE=NULL; for(CurrentB=HeadB;CurrentB!=NULL;CurrentB=CurrentB->next)//访问所有桶结点 { for(CurrentE=CurrentB->p;CurrentE!=NULL;CurrentE=CurrentE->next)//访问桶中排序前的边结点 { AET *TempEdge=new AET; TempEdge->x=CurrentE->x; TempEdge->yMax=CurrentE->yMax; TempEdge->k=CurrentE->k; TempEdge->next=NULL; AddEdge(TempEdge);//将该边插入临时Aet表 } EdgeOrder();//使得边表按照x递增的顺序存放 T1=HeadE;//根据ymax抛弃扫描完的边结点 if(T1==NULL) { return; }

计算机图形学实验报告-OpenGL基本使用

学生实验实习报告册 学年学期:2016-2017学年 春□√秋学期 课程名称:大学计算机基础 学生学院:通信与信息工程学院 专业班级: 学生学号: 学生姓名: 联系电话: 重庆邮电大学教务处印制

实验实习名OpenGL基本使用 指导教师秦红星考核成绩 课程名称计算机图形学A 课程编号 实验实习地点信息科技大厦S306 完成日期 学生姓名学生学号 学院专业广电与数字媒体类所在班级 教师评语 教师签名: 年月日 一、实验实习目的及要求 目的: 认识了解OpenGL的性质、功能 要求: 1.利用OpenGL绘制一个简单的场景:比如球体、正方体 2.加入灯光 3.实现交互操作:平移、缩放、旋转 二、实验实习设备(环境)及要求(软硬件条件) 采用Microsoft Visual C 2010生成环境并用C++编写程序 三、实验实习内容与步骤 内容: 背景为黑色,在点光源下,能够实现平移、缩放、旋转的球。 步骤: 建立立体-->添加光照-->添加变换 1.先写“主函数”,在主函数中将窗口生成好。 2.在“自定义函数1”中对窗口进行清除、填色等操作。 3.在“自定义函数1”中设置点光源,设置光照的各种参数。 4.在“自定义函数1”中设置平移、缩放、旋转及各参数。 5.在“自定义函数2”中设置平移和缩放的循环。 6.在主函数中调用这两个自定义函数,并且在主函数里面用“自定义函数1”为参数调用glutDisplayFunc()来注册一个绘图函数。其次用空闲回调函数glutIdleFunc()来使球体不停地循环有缩放、平移功能的函数。实现动画。 四、实验实习过程或算法(源程序、代码) #include

opengl实验报告

opengl实验报告 OpenGL实验报告 引言: OpenGL(Open Graphics Library)是一种跨平台的图形编程接口,被广泛应用 于计算机图形学、游戏开发和科学可视化等领域。本实验报告将介绍我对OpenGL的实验研究和学习成果。 一、实验目的 本次实验的主要目的是掌握OpenGL的基本概念和使用方法,了解图形渲染的 原理和过程,以及学习如何在OpenGL中创建和操作图形对象。 二、实验环境 本次实验使用的是OpenGL的最新版本,并在Windows操作系统下进行开发。使用的开发工具是Visual Studio和OpenGL的开发库。 三、实验过程 1. 熟悉OpenGL的基本概念 在开始实验之前,我先学习了OpenGL的基本概念,包括OpenGL的坐标系统、图形渲染管线、着色器等。了解这些概念对于后续的实验非常重要。 2. 创建窗口和上下文 在OpenGL中,我们需要先创建一个窗口和一个OpenGL上下文,以便进行图 形渲染。通过调用相关的OpenGL函数,我成功创建了一个窗口,并初始化了OpenGL的上下文。 3. 绘制基本图形 接下来,我开始尝试绘制一些基本的图形,比如点、线和三角形。通过设置顶

点坐标和颜色,我成功绘制出了这些基本图形,并在窗口中显示出来。 4. 添加纹理 为了使图形更加逼真和丰富,我学习了如何在OpenGL中添加纹理。通过加载图片并设置纹理坐标,我成功将纹理贴在了绘制的图形上,使其具有了更加真实的效果。 5. 光照和阴影效果 为了增加图形的立体感和真实感,我学习了如何在OpenGL中添加光照和阴影效果。通过设置光源的位置和属性,以及材质的属性,我成功实现了光照和阴影的效果,使图形看起来更加逼真。 6. 动画效果 为了使图形具有动态效果,我学习了如何在OpenGL中实现简单的动画效果。通过每帧更新顶点的位置和纹理坐标,我成功实现了图形的旋转和平移动画,使其具有了动态的效果。 四、实验结果和分析 通过以上的实验过程,我成功掌握了OpenGL的基本概念和使用方法,并实现了一些基本的图形渲染效果。通过添加纹理、光照和阴影效果,我使图形看起来更加真实和立体。通过动画效果,我使图形具有了动态的效果,增加了视觉的吸引力。 五、实验总结 通过本次实验,我对OpenGL的理论知识和实际应用有了更深入的了解。我学会了如何创建窗口和上下文,绘制基本图形,添加纹理和实现光照效果。我还学会了如何实现简单的动画效果,使图形具有动态的效果。通过这些实验,我

计算机图形学实验报告

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void) { glMatrixMode(GL_PROJECTION); } void DDALine(int x0,int y0,int x1,int y1) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3);

glBegin(GL_POINTS); glEnd(); x+=xIncre; y+=yIncre; } } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush(); } void winReshapeFcn(GLint newWidth, GLint newHeight) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); winWidth=newWidth; winHeight=newHeight; } int main(int argc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return 0; }

计算机图形学实验报告

实验报告 一、实验目的 1、掌握有序边表算法填充多边形区域; 2、理解多边形填充算法的意义; 3、增强C语言编程能力。 二、算法原理介绍 根据多边形内部点的连续性知:一条扫描线与多边形的交点中,入点和出点之间所有点都是多边形的内部点。所以,对所有的扫描线填充入点到出点之间所有的点就可填充多边形。 判断扫描线上的点是否在多边形之内,对于一条扫描线,多边形的扫描转换过程可以分为四个步骤: (1)求交:计算扫描线与多边形各边的交点; (2)排序:把所有交点按x值递增顺序排序; (3)配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线与多边形的一个相交区间; (4)着色:把相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。 p1,p3,p4,p5属于局部极值点,要把他们两次存入交点表中。如扫描线y=7上的交点中,有交点(2,7,13),按常规方法填充不正确,而要把顶点(7,7)两次存入交点表中(2,7,7,13)。p2,p6为非极值点,则不用如上处理。

为了提高效率,在处理一条扫描线时,仅对与它相交的多边形的边进行求交运算。把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中,称此链表为活性边表(AET)。 对每一条扫描线都建立一个与它相交的多边形的活性边表(AET)。每个AET的一个节点代表一条活性边,它包含三项内容 1.x -当前扫描线与这条边交点的x坐标; 2.Δx -该边与当前扫描线交点到下一条扫描线交点的x增量; 3.ymax -该边最高顶点相交的扫描线号。 每条扫描线的活性边表中的活性边节点按照各活性边与扫描线交点的x值递增排序连接在一起。 当扫描线y移动到下一条扫描线y = y+1时,活性边表需要更新,即删去不与新扫 描线相交的多边形边,同时增加与新扫描线相交的多边形边,并根据增量法重新计算扫描线与各边的交点x。 当多边形新边表ET构成后,按下列步骤进行: ①对每一条扫描线i,初始化ET表的表头指针ET[i]; ②将ymax = i的边放入ET[i]中; ③使y =多边形最低的扫描线号; ④初始化活性边表AET为空; ⑤循环,直到AET和ET为空。 ●将新边表ET中对应y值的新边节点插入到AET表。 ●遍历AET表,将两两配对的交点之间填充给定颜色值。 ●遍历AET表,将 ymax= y的边节点从AET表中删除,并将ymax> y的各 边节点的x值递增Δx;并重新排序。 ●y增加1。 三、程序源代码 #include "graphics.h" #define WINDOW_HEIGHT 480 #define NULL 0 #include "alloc.h" #include "stdio.h" #include "dos.h" #include "conio.h"

相关文档
最新文档