资源描述:
《裁剪计算机图形学.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验报告(2013—2014学年第二学期)课程名称:计算机图形学姓名:学院:专业:年级:实验报告2014年5月15日第3·4节综合楼426号室进入实验室时间进入时仪器设备状况离开实验室时间离开时仪器设备状况机器号9:50良好11:30良好32实验项目名称二维图形变换一、实验目的1.掌握cohen-sutherland直线段裁剪算法2.掌握sutherland-hodgman多边形裁剪算法二、实验内容1.利用cohen-sutherland算法实现直线段关于矩形窗口的裁减2.利用sutherland-hodgman算法实
2、现多边形关于矩形窗口的裁减实验过程:直线段的裁剪:1.编写相应程序(看教材代码),并调试。2.分完全可见、显然不可见、至少一个端点在窗口之外但非显然不可见三种情况,测试各种斜率的直线,查看程序运行结果。3.比较教材代码和下列代码,指出下列代码存在的问题。多边形的裁剪:1.写出intersect()函数的功能2.写出inside()函数的功能3.根据sutherland-hodgman算法,在sutherlandhodgmanpolygonclip()函数的/**/处写注释4.编写main函数,并调试三、实验过程(步骤)
3、及结果(源程序)(1)直线裁剪代码:typedefstruct{intxmax;intxmin;intymax;intymin;}rectang;structOutCode{intall;inttop;intbottom;intleft;intright;};voidCompOutCode(floatx,floaty,rectang*rect,OutCode*outcode){outcode->all=0;outcode->top=outcode->bottom=0;if(y>(float)rect->ymax){ou
4、tcode->bottom=1;outcode->all+=1;}elseif(y<(float)rect->ymin){outcode->top=1;outcode->all+=1;}outcode->right=outcode->left=0;if(x>(float)rect->xmax){outcode->right=1;outcode->all+=1;}elseif(x<(float)rect->xmin){outcode->left=1;outcode->all+=1;}}rectangCohenSuther
5、(float*xx0,float*yy0,float*xx1,float*yy1,rectang*rect){intaccept,done;OutCodeoutcode0,outcode1;OutCode*outcodeout;floatx0,y0,x1,y1;x0=*xx0;y0=*yy0;x1=*xx1;y1=*yy1;floatx,y;accept=FALSE;done=FALSE;CompOutCode(x0,y0,rect,&outcode0);CompOutCode(x1,y1,rect,&outcode1
6、);do{if(outcode0.all==0&&outcode1.all==0){//可见区域accept=TRUE;done=TRUE;}elseif((outcode0.all&outcode1.all)!=0)//显然不可见区域done=TRUE;else{//既非可见,又非显然可见区域if(outcode0.all!=0)//选窗口外的端点outcodeout=&outcode0;elseoutcodeout=&outcode1;if(outcodeout->left){//交点在左边y=y1+(y1-y0)
7、*(rect->xmin-x1)/(x1-x0);x=(float)rect->xmin;}elseif(outcodeout->top){//交点在上边x=x1+(x1-x0)*(rect->ymin-y1)/(y1-y0);y=(float)rect->ymin;}elseif(outcodeout->right){//交点在右边y=y1+(y1-y0)*(rect->xmax-x1)/(x1-x0);x=(float)rect->xmax;}elseif(outcodeout->bottom){//交点在下边x=
8、x1+(x1-x0)*(rect->ymax-y1)/(y1-y0);y=(float)rect->ymax;}if(outcodeout->all==outcode0.all){//丢弃显然不可见区域端点x0=x;y0=y;CompOutCode(x0,y0,rect,&outcode0);}else{x1=x;y1=y;Com