資源描述:
《裁剪計(jì)算機(jī)圖形學(xué).doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、實(shí)驗(yàn)報(bào)告(2013—2014學(xué)年第二學(xué)期)課程名稱:計(jì)算機(jī)圖形學(xué)姓名:學(xué)院:專業(yè):年級(jí):實(shí)驗(yàn)報(bào)告2014年5月15日第3·4節(jié)綜合樓426號(hào)室進(jìn)入實(shí)驗(yàn)室時(shí)間進(jìn)入時(shí)儀器設(shè)備狀況離開實(shí)驗(yàn)室時(shí)間離開時(shí)儀器設(shè)備狀況機(jī)器號(hào)9:50良好11:30良好32實(shí)驗(yàn)項(xiàng)目名稱二維圖形變換一、實(shí)驗(yàn)?zāi)康?.掌握cohen-sutherland直線段裁剪算法2.掌握sutherland-hodgman多邊形裁剪算法二、實(shí)驗(yàn)內(nèi)容1.利用cohen-sutherland算法實(shí)現(xiàn)直線段關(guān)于矩形窗口的裁減2.利用sutherland-hodgman算法實(shí)
2、現(xiàn)多邊形關(guān)于矩形窗口的裁減實(shí)驗(yàn)過程:直線段的裁剪:1.編寫相應(yīng)程序(看教材代碼),并調(diào)試。2.分完全可見、顯然不可見、至少一個(gè)端點(diǎn)在窗口之外但非顯然不可見三種情況,測(cè)試各種斜率的直線,查看程序運(yùn)行結(jié)果。3.比較教材代碼和下列代碼,指出下列代碼存在的問題。多邊形的裁剪:1.寫出intersect()函數(shù)的功能2.寫出inside()函數(shù)的功能3.根據(jù)sutherland-hodgman算法,在sutherlandhodgmanpolygonclip()函數(shù)的/**/處寫注釋4.編寫main函數(shù),并調(diào)試三、實(shí)驗(yàn)過程(步驟)
3、及結(jié)果(源程序)(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){//可見區(qū)域accept=TRUE;done=TRUE;}elseif((outcode0.all&outcode1.all)!=0)//顯然不可見區(qū)域done=TRUE;else{//既非可見,又非顯然可見區(qū)域if(outcode0.all!=0)//選窗口外的端點(diǎn)outcodeout=&outcode0;elseoutcodeout=&outcode1;if(outcodeout->left){//交點(diǎn)在左邊y=y1+(y1-y0)
7、*(rect->xmin-x1)/(x1-x0);x=(float)rect->xmin;}elseif(outcodeout->top){//交點(diǎn)在上邊x=x1+(x1-x0)*(rect->ymin-y1)/(y1-y0);y=(float)rect->ymin;}elseif(outcodeout->right){//交點(diǎn)在右邊y=y1+(y1-y0)*(rect->xmax-x1)/(x1-x0);x=(float)rect->xmax;}elseif(outcodeout->bottom){//交點(diǎn)在下邊x=
8、x1+(x1-x0)*(rect->ymax-y1)/(y1-y0);y=(float)rect->ymax;}if(outcodeout->all==outcode0.all){//丟棄顯然不可見區(qū)域端點(diǎn)x0=x;y0=y;CompOutCode(x0,y0,rect,&outcode0);}else{x1=x;y1=y;Com