1计算机图形学实验报告第一次2目录1.实验目的........................................................................................................................................32.实验内容........................................................................................................................................32.1.Bresenham画直线算法.....................................................................................................32.2.Bresenham画圆算法.........................................................................................................32.3.Bresenham画椭圆算法.....................................................................................................42.4.多边形阴影线填充算法.....................................................................................................52.5.多边形扫描转换算法.........................................................................................................53.实验步骤........................................................................................................................................63.1.程序设计.............................................................................................................................63.1.1.画线段......................................................................................................................73.1.2.画圆..........................................................................................................................83.1.3.画椭圆....................................................................................................................103.1.4.多边形阴影线填充................................................................................................113.1.5.多边形区域扫描填充............................................................................................153.2.程序运行结果...................................................................................................................243.2.1.画直线....................................................................................................................243.2.2.画圆........................................................................................................................253.2.3.画椭圆....................................................................................................................253.2.4.多边形阴影线填充................................................................................................263.2.5.多边形区域扫描填充............................................................................................274.实验总结......................................................................................................................................2831.实验目的仅调用画点函数,设计实现一个图形函数库,具有以下功能:1.画线段。2.画圆弧。3.画椭圆。4.画多边形。5.多边形区域的阴影线填充。6.多边形扫描转换算法:颜色填充。实验环境:DevC++实验语言:C语言2.实验内容此次实验目的采用了以下算法实现。2.1.Bresenham画直线算法根据直线的斜率确定选择X或者Y方向作为计长方向,在此方向上每次递增一个单位步长(或者一个像素单位),另一个方向上是否同时产生一个单位增量由一个计算量很小的判别式来判断。(以斜率在0~1之间的直线段为例)这种情况下,选择X方向为计长方向,即增量dx=1。如下图所示,设Pi(xi,yi)是已选定的离直线最近的像素,现在要决定Pi+1是T还是S。若d0.5,则S比较靠近直线,应选S;若d=0.5,则应选T。(m=△y/△x)令e=d-0.5(初值为m-0.5),即有:e0时,选Pi+1(xi+1,yi),更新e=e+m;e=0时,选Pi+1(xi+1,yi+1),更新e=e+m-1。2.2.Bresenham画圆算法与Bresenham直线生成算法一样,其基本方法是从一个起点出发,利用判别式选择下一个显示点。判别式的值通过简单计算获得,其符号用作判断。(以位于第一象限的1/8圆弧为例)4此算法在每一步都选择一个离开理想圆周最近的点Pi(xi,yi),使其误差项|D(Pi)|=|xi2+yi2-R2|在每一步都是极小值。设Pi-1(xi-1,yi-1)已被选定为最靠近圆弧的点,下一步x=xi-1+1时,参见下图:要决定T还是S更接近理想的圆弧,令D(S)=(xi-1+1)2+yi-12-R2D(T)=(xi-1+1)2+(yi-1-1)2-R2显然,|D(S)|=|D(T)|时,应该取T点,反之则取S点。即若令di=|D(S)|-|D(T)|则di=0,选择T点,否则选取S点。结论:d1=3-2R;如果di0,选Pi(xi,yi-1),将yi=yi-1代入求di+1:di+1=di+4xi+2=di+4xi-1+6如果di=0,选Pi(xi,yi-1-1),将yi=yi-1-1代入求di+1:di+1=di+4xi-4yi-1+6=di+4(xi-1-yi-1)+102.3.Bresenham画椭圆算法与Bresenham直线和圆生成算法原理一样,但是椭圆的生成的过程中要分为上半部与下半部的情况讨论。在生成椭圆上部区域时,以x轴为步进方向,如图所示:x每步进一个单位,就需要在判断y保持不变还是也步进减1,bresenham算法定义判别式为:di=d1-d2如果di0,则取P1为下一个点,否则,取P2为下一个点。采用判别式di,使得判别式规约为全整数运算,算法效率得到了很大的提升。根据椭圆方程,可以计算出d1和d2分别是:d1=a2(yi2-y2)d2=a2(y2-yi+12)以(0,b)作为椭圆上部区域的起点,将其代入判别式di可以得到如下递推关系:当di0时,di+1=di+2b2(2xi+3)5当di=0时,di+1=di+2b2(2xi+3)-4a2(yi-1)d1=2b2–2a2b+a2在生成椭圆下部区域时,以y轴为步进方向,如图所示:y每步进减一个单位,就需要在判断x保持不变还是步进加一个单位,对于下部区域,计算出d1和d2分别是:d1=b2(xi+12-x2)d2=b2(x2-xi2)以(xp,yp)作为椭圆下部区域的起点,将其代入判别式di可以得到如下递推关系:当di0时,di+1=di-4a2(yi-1)+2a2当di=0时,di+1=di+2b2(xi+1)-4a2(y-1)+2a2+b2d1=b2(xp+1)2+b2xp2-2a2b2+2a2(yp-1)22.4.多边形阴影线填充算法算法步骤如下:a.对于MN条棱边,计算每一条棱边Li的两个端点分别按阴影线斜率k=tgα引线得到的截距,其中较小值放在B(1,i)中,较大值放在B(2,i)中。b.求出Bmin=minB(1,i),Bmax=maxB(2,i),i=1,2,...,MN。c.取第一条阴影线截距为b=Bmin+△b(△b=h/|cosα|)。d.初始化存放阴影线与各棱边交点的数组D(2,MN);判断当前阴影线与各棱边是否有交点,若存在则计算出交点坐标并存入D数组;按X/Y坐标排列D数组中的交点并生成阴影线段;取下一条阴影线b=b+△b,若b≠Bmax转d继续。2.5.多边形扫描转换算法算法步骤如下:a.非极值奇点的预处理。(极值奇点算作2个交点;非极值奇点算作1个交点)b.建立边的分类表ET。c.取扫描线初始值y为ET表中所列的最小y坐标值。d.边的活化链表AEL初始化,使其为空。e.重复下列操作,直至ET表和AEL表都变成空:e1.把ET表中纵坐标为y的链取下,与AEL表合并,并保持AEL表中元素按x域值升序排列,x相同时,按△x域。e2.对于当前扫描线y,从左到右,将AEL表中元素两两配对,按每对两个x域定义的区段填充所需要的像素值。e3.将AEL表中满足ymax=y的元素删除;6e4.对于仍留在AEL表中的元素,求下一条扫描线与边的交点,即x域累加△x:x=x+△x。e5.取下一条扫描线作为当前扫描线:y=y+1。3.实验步骤3.1.程序设计函数库的声明部分如下:#includestdio.h#includestdlib.h#includemath.h#includewindows.h#definePI3.1416#defineDEF-10000#defineMAX100structl