《计算机图形学实验报告_12.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告_12.docx(29页珍藏版)》请在第一文库网上搜索。
1、计算机图形学实验报告-k实验题目:利用计算机编程语言绘制图形,主要实现以下内容:(1)、中点算法生成任意斜率直线,并设置线型线宽。(2)、中点算法生成圆(3)、中点算法生成椭圆(4)、扫描算法实现任意多边形填充(5)COhen_Suther1and裁剪(6)、自由曲线与曲面的绘制(7)、二维图形变换(8)、三视图变换二、系统分析与设计本实验采用C语言编程,运行环境为TurboC;三、算法思想及程序实现1、中点算法生成任意斜率直线,并设置线型线宽。(1).算法思想假定直线斜率k在01之间(k的其它取值可以类似处理),当前象素点为QXmy),则下一个象素点有两种可选择点A(耳+1,%)或R(4+1
2、,%+1)。若片与己的中点(4+1,%+0.5)称为M。为理想直线与方4+1垂线的交点。当M在。的下方时,则取己应为下一个象素点;当在O的上方时,则取A为下一个象素点。这就是中点画线法的基本原理。下面讨论中点画线法的实现。过点(%,%)、(小,必)的直线段的方程式为F(x,y)=a-f-by-f-c=O,其中,a=yfyx,b=xx0tc=xQy-XiyQf欲判断中点在0点的上方还是下方,只要把V代入/(x,y),并判断它的符号即可。为此,我们构造判别式:d=FUf)=F(x计1+0.5)=a(4+1)+6(%+0.5)+c当水O时,材在(。点)下方,取鸟为下一个象素;当力O时,材在(。点)上
3、方,取R为下一个象素;当少0时,选片或K均可,约定取A为下一个象素;注意到d是心力的线性函数,可采用增量计算,提高运算效率。若当前象素处于0情况,则取正右方象素A(%,+1,%),要判下一个象素位置,应计算d=尸(4+2,%+0.5)=a(%+2)+6(%+0.5)=*3,增量为外若水0时,则取右上方象素冏(3+1,Do要判断再下一象素,则要计算F(X注2,+1.5)=a(3+2)+b(%+15)+GAa+b,增量为a+瓦画线从(岗,外)开始,d的初值=7(+1,%+0.5)=尸(加,%)+a+0.56,因F5%)=0,所以d=a+0.5瓦由于我们使用的只是d的符号,而且d的增量都是整数,只是
4、初始值包含小数。因此,我们可以用2d代替d来摆脱小数。(2)程序实现voidputpixe1s(intx,inty,intco1or,intn)inti,j;for(i=-n2;i=n2;i+)for(j=-n/2;j=n/2;j+)putpixe1(x+j,y+i,co1or);voidMidpoint1ine(intx,inty,intx1,inty1,intco1or,intn)(inta,b,dx,dy,d,x,y,incrP1,incrP2;if(x=x1)(if(yy1)for(y=y;y=y1;y一)putpixe1(x,y,co1or);)e1seif(xx1)(if(yy1)
5、(dy-y1-y;dx-x1-;d=d-2*dy;incrP1=-2*dy;incrP2=2*(d-dy);x=x;y=y;putpixe1s(x,y,co1or,n);whi1e(xx1)(if(d0)y+;d+=incrP2je1sed+=incrP1;x+;putpixe1s(x,y,co1or,n);)e1se(dy-y1-y;dx=x1-;d=-2*dy-dx;incrP1=-2*(dx+dy);incrP2=-2*dy;x-x;y-y;putpixe1s(x,y,co1or,n);whi1e(x0)y;d+=incrP1;e1sed+=incrP2;x+;putpixe1s(x,y
6、,co1or,n);)e1seif(xx1)if(yy1)dy=yy1;dx=xx1;d=-2*dy-dx;incrP1=-2*(dx+dy);incrP2=-2*dy;=1;y-y1;putpixe1s(x,y,co1or,n);whi1e(xO)y一;d=incrP1;e1sed+=incrP2;x+;putpixe1s(x,y,co1or,n);)e1se(dy-y-y1;dx-x-x1;d-dx-2*dy;incrP1=-2*dy;incrP2=2*(d-dy);x=x1;y=y1;putpixe1s(x,y,co1or,n);whi1e(xx)if(d0,对于圆内的点尸(x,y)0O
7、与中点画线法一样,构造判别式:d=FUf)=F(x计1-0.5)=U+1)2+(-0.5)2-4若水0,则应取A为下一象素,而且再下一象素的判别式为:d=F(x42,-0.5)=(+2)2+(-05尸一二在2%,+3若心0,则应取R为下一象素,而且下一象素的判别式为dF(x2,yp-1.5)=+2)2+(%T.5)之=d+2(&-%)+5我们这里讨论的第一个象素是(0,冷,判别式d的初始值为:即F(1R0.5)=1.25-7?为了进一步提高算法的效率,将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。(2)程序实现:voidmidpointcirc1e(int
8、R)intx,y,de1tax,de1tay,d;x=O;y=R;d=1-R;de1tax=3;de1tay=5-R-R;putpixe1(x+300,y+300,GREEN);whi1e(xy)(if(d1时相同,要以y为自变量,在此不再详细叙述。对于椭圆:考虑分界点的上部的弧段,此段的斜率m-1,0,由像素(七,M)递推出后继的像素U-+1,r)o根据条件得到r11y先,/,)V+5)r31n+=W当4o当4o4+4从(2为+3)当404+4/(2玉+3)8/(Kr-1)当40(,%)=(力)初始条件为d0=4/(1力-;)=4b2_4a2b+2,对于分界点下方的弧段,可类似求得。(2)程
9、序实现voidputpixe1s(intx,inty,intco1or,intn)iti,j;for(i=-n/2;i=n/2;i+)for(j=-n2;j=n2;j+)putpixe1(x+j,y+i,co1or);voide11ipsepoint(1ongx,1ongy,1ongx,1ongy,1ongco1or,intn)putpixe1s(int)(x+x),(int)(y+y),(int)co1or,n);putpixe1s(int)(xx),(int)(y+y),(int)co1or,n);putpixe1s(int)(x+x),(int)(y-y),(int)co1or,n);p
10、utpixe1s(int)(xx),(int)(y-y),(int)co1or,n);voidIiiidpointe1Iipse(1ongx,1ongy,1onga,1ongb,1ongco1or,intn)1ongx,y,d,sa,sb,xp,yp;sa=a*a,sb=b*b;xp-(1ong)(f1oat)sa(f1oat)sqrt(f1oat)(sa+sb);yp=(1ong)(f1oat)sb(f1oat)sqrt(f1oat)(sa+sb);x=0,y=b,d=sa+4*sb-4*sa*b;whi1e(xxp)(if(dO)d=d+4*sb*(2*x+3);x+;e1sed=d+4*
11、sb*(2*x+3)+4*sa*(2-2*y);x+;y;)e11ipsepoint(x,y,x,y,co1or,n);)x=a,y=0,d=4*sa+sb-4*a*sb;whi1e(yyp)if(dO)(d-d+4*sa*(2*y+3);y+;e1se(d=d+4*sa*(2*y+3)+4*sb*(2-2*x);y+;X;e11ipsepoint(x,y,x,y,co1or,n);4、用扫描线算法实现多边形填充:(1)算法思想:用水平扫描线从上到下扫描由点线段构成的多段定义的多边形。每根扫描线与多边形各边产生一系列交点,将这些交点按照X坐标进行排序,将排序后的交点成对取出,作为两个端点,用所
12、需填充的色彩画水平直线。多边形被扫描完毕,则填充结束。实现步骤:(1)建立边的分类表ET;(2)将扫描线纵坐标y的初值为ET中非空元素的最小序号;(3)置活化边表AE1为空;(4)执行下列步骤直至ET和AE1都为空;A、如果ET中的第y类非空,则将其中的所有边取出并插入AE1中,在插入过程忠进行排序;B、 对AE1中的边两两配对,将每对边中X坐标按规则取整,获得有效的填充区段,再填充;C、 将当前扫描线纵坐标y值递增1,即尸1;D、将AE1中满足y=ymax边删去;E、对AE1中剩下的每一条边的X递增de1tax,即x=x+de1tax;(2)程序实现tedefstruct(inty_top;f1oatx_int;intde1ta_y;f1oatx_change_per_scan;EACH_ENTRY;EACH_ENTRYsidesMAX_P0INT;intxMAX_POINT,yMAX_POINT;intside_count,first_s,1ast_s,scan,bottomscan,x_int_count;vo