计算机图形学实验报告-实验1直线段扫描转换

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1计算机图形学实验报告班级计算机工硕班学号2011220456姓名王泽晶2实验一:直线段扫描转换实验目的通过本次试验,学生可以掌握直线段的扫描转换算法及其程序设计方法。实验内容1.绘制20*20的网格线,格子X和Y方向间隔均为20像素,网格起始坐标在(20,20)。我们使用此网格模拟像素矩阵(019,019xy),格子交叉点是像素中心。2.输入直线段两端点,可使用以下两种方法之一:a)对话框输入b)鼠标在网格内以鼠标左键按下-拖动-抬起方式输入。注意:直线段两端点要自动取整到模拟的像素中心位置3.进行直线段扫描转换,通过点击鼠标右键调用方式或者菜单调用的方式执行。计算完成后,将扫描转换结果,在模拟的像素矩阵中,使用圆形显示出来。方法一:直线的中点算法算法的主要思想:讨论斜率k∈[1,+∞)上的直线段的中点算法。对直线01pp,左下方的端点为0p(x0,y0),右上方的端点为1p(x1,y1)。直线段的方程为:ymxByyxBxyyxxBx(,)0FxyxyyxxB现在假定已求得像素(,,irixy),则如图得,,11(,]22iirirxxx由于直线的斜率k∈[1,+∞),故m=1/k∈(0,1],则1,,13(,]22iirirxxx在直线1iyy上,区间,,13(,]22irirxx内存在两个像素NE和E。根据取整原则,当311(,)iixy在中点M11(,)2iixy右方时,取像素NE,否则取像素E,即,11,,1()()01()()0iriiririxEFMxxxNEFMxii点当(,y+1)在左方时点当(,y+1)在右方时若取2()idFM,则上式变为,1,,()01(0iriiririxEdxxNEd点当点)当计算id的递推公式如下:,11,12[(2)()]0122(,2)0122[(2)(1)]2iiriiiiiiirxyyxxBddFxydxyyxxB=202()0iiiidxddxyd算法的初始条件为:00,00,0(,)(0,0)12(,1)22rrxyxydFxyxy相应的程序示例:publicfunctiondrawLine(pixelDrawer:Function,x0:int,y0:int,x1:int,y1:int):void{vardx:Number=x1-x0;vardy:Number=y1-y0;varx:Number;vary:Number;if((dx==0)&&(dy==0)){//两点重合时,直接绘制重合的点pixelDrawer(x0,y0);return;}elseif(dx==0){//第二点落在X轴上,直接绘制直线上的点varstep:Number=dy/Math.abs(dy);for(y=y0;y!=y1;y+=step)4pixelDrawer(x0,y);}elseif(dy==0){//第二点落在Y轴上,直接绘制直线上的点step=dx/Math.abs(dx);for(x=x0;x!=x1;x+=step)pixelDrawer(x,y0);}varstepX:Number=dx/Math.abs(dx);varstepY:Number=dy/Math.abs(dy);x=x0,y=y0;pixelDrawer(x,y);//绘制起点vark:Number=dy/dx;if(Math.abs(k)1.0)//斜率1的情形,以X为自变量递增{vara:Number=-Math.abs(dy);varb:Number=Math.abs(dx);vard:Number=2*a+b;vard1:Number=2*a;vard2:Number=2*(a+b);while(x!=x1){if(d0){x+=stepX;y+=stepY;d+=d2;}else{x+=stepX;d+=d1;}pixelDrawer(x,y);}}else//斜率=1的情形,以Y为自变量递增{a=-Math.abs(dx);b=Math.abs(dy);d=2*a+b,d1=2*a,d2=2*(a+b);while(y!=y1){if(d0){x+=stepX;y+=stepY;d+=d2;}else{y+=stepY;d+=d1;}pixelDrawer(x,y);}}pixelDrawer(x1,y1);//绘制终点5}编译运行程序得到如下结果:方法二:直线的数值微分法算法的主要思想:由于课本上已经给出了斜率m∈[-1,1]上的算法,故此处给出斜率m∈[1,+∞〕上的算法,m∈(-∞,-1]上的可同理推导。已知待扫描转换的直线为0p(x0,y0),1(1,1)pxy,又10,10xxxyyy,则设k=1/m=/xy(即k∈(0,1])。直线方程为1yxBk,即()xkyB。以一个像素为单位分割区间[y0,y1],由x0x1,故y0y1,得到[y0,y1]上的一个划分:0y,1y,….ny,其中1iy=iy+1,得到点列0(,)niiixy,由公式11()(1)iiiixkyBkyBxk故从ix直接得到1ix。ix可能为浮点数,要对它取整,实际得到像素集,0(,)niirixy。初值为:(00,xy)=(x0,y0)。实验内容:6编写自定义的算法类,程序:publicfunctiondrawLine(pixelDrawer:Function,x0:int,y0:int,x1:int,y1:int):void{vardx:int=x1-x0vardy:int=y1-y0;if((dx==0)&&(dy==0)){//两点重合时,直接绘制重合的点pixelDrawer(x0,y0);return;}elseif(dx==0){//第二点落在X轴上,直接绘制直线上的点varstep:int=dy/Math.abs(dy);for(vary:int=y0;y!=y1;y+=step)pixelDrawer(x0,y);}elseif(dy==0){//第二点落在Y轴上,直接绘制直线上的点step=dx/Math.abs(dx);for(varx:int=x0;x!=x1;x+=step)pixelDrawer(x,y0);}else{vark:Number=dy/dx;if(Math.abs(k)1)//斜率1的情形,以X为自变量递增{vary2:Number=0.0;y2=y0;step=dx/Math.abs(dx);for(x=x0;x!=x1;x+=step){pixelDrawer(x,int(y2+0.5));y2=y2+k*step;}}else//斜率=1的情形,以Y为自变量递增{varx2:Number=0.0;varkInv:Number=1.0/k;x2=x0;7step=dy/Math.abs(dy);for(y=y0;y!=y1;y+=step){pixelDrawer(int(x2+0.5),y);x2=x2+kInv*step;}}}pixelDrawer(x1,y1);//绘制终点}编译运行程序得到如图所示结果:方法三:生成直线段的Bresenham算法与中点算法类似,Bresenham算法也是通过在每列像素中确定与理想直线最近的像素来进行直线扫描转换的。为了讨论方便,此处假定直线的斜率在0,1之间。对直线对直线01pp,左下方的端点为0p(x0,y0),右上方的端点为1p(x1,y1)。如图,由ix到11iixx,则d=d+m,一旦d1时,d=d-1,以保证d始终在0,1之间。10.5()0.51()iiidyEydyNE点点初始条件为:000(,)(0,0)0xyxyd8编写成员函数如下:publicfunctiondrawLine(pixelDrawer:Function,x0:int,y0:int,x1:int,y1:int):void{vardx:Number=x1-x0;vardy:Number=y1-y0;varstep:Number;varx:Number;vary:Number;if((dx==0)&&(dy==0)){//两点重合时,直接绘制重合的点pixelDrawer(x0,y0);return;}elseif((dx==0)){//第二点落在X轴上,直接绘制直线上的点step=dy/Math.abs(dy);for(y=y0;y!=y1;y+=step)pixelDrawer(x0,y);}elseif((dy==0)){//第二点落在Y轴上,直接绘制直线上的点step=dx/Math.abs(dx);for(x=x0;x!=x1;x+=step)pixelDrawer(x,y0);}varabsDX:Number=Math.abs(dx);varabsDY:Number=Math.abs(dy);varstepX:Number=dx/absDX;varstepY:Number=dy/absDY;vark:Number=dy/dx;if(Math.abs(k)1.0)//斜率1的情形,以X为自变量递增{vare:Number=-absDX;x=x0;y=y0;for(vari:Number=0;i!=dx;i+=stepX){pixelDrawer(x,y);x+=stepX;9e+=2*absDY;if(e=0){y+=stepY;e-=2*absDX;}}}else//斜率=1的情形,以Y为自变量递增{e=-absDY;x=x0;y=y0;for(i=0;i!=dy;i+=stepY){pixelDrawer(x,y);y+=stepY;e+=2*absDX;if(e=0){x+=stepX;e-=2*absDY;}}}pixelDrawer(x1,y1);//绘制终点}编译运行得到以下结果:

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功