圖形學(xué)實(shí)驗(yàn)報(bào)告直線段的裁剪算法_第1頁(yè)
圖形學(xué)實(shí)驗(yàn)報(bào)告直線段的裁剪算法_第2頁(yè)
圖形學(xué)實(shí)驗(yàn)報(bào)告直線段的裁剪算法_第3頁(yè)
圖形學(xué)實(shí)驗(yàn)報(bào)告直線段的裁剪算法_第4頁(yè)
圖形學(xué)實(shí)驗(yàn)報(bào)告直線段的裁剪算法_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、實(shí)驗(yàn)報(bào)告Experimentation Report of Taiyuan teachers College報(bào) 告一、實(shí)驗(yàn)?zāi)康亩?、?shí)驗(yàn)原理三、實(shí)驗(yàn)儀器及材料內(nèi) 容四、實(shí)驗(yàn)方法五、實(shí)驗(yàn)記錄及數(shù)據(jù)處理六、誤差分析及討論系部計(jì)算機(jī)系年 級(jí)三年級(jí) 課程圖形學(xué)姓名 同組者 日期項(xiàng)目直線段的裁剪算法一、實(shí)驗(yàn)?zāi)康模? .熟悉圖形裁剪的基本知識(shí)2 . 掌握Cohen-Sutherland直線裁剪算法二、實(shí)驗(yàn)內(nèi)容:在矩形窗口的裁剪算法中,考慮到構(gòu)成圖形的基本元素就是線段,曲線可看成是有很多小線段逼近而成的,因此,討論線段的裁剪算法更為實(shí)用,即 Cohen-Sutherland 裁剪算法。Cohen-Suther

2、land裁剪算法具體思路如下。任意平面線段和矩形窗口白位置關(guān)系只會(huì)有如下3種:(1)完全落在窗口內(nèi)。(2)完全落在窗口外。(3)部分落在窗口內(nèi),部分落在窗口外。要想判斷線段和窗口的位置關(guān)系,只要找到線段的兩端點(diǎn)相對(duì)于矩形窗口的 位置即可,線段的兩端點(diǎn)相對(duì)于矩形窗口的位置可能會(huì)有如下幾種情況:(1)線段的兩個(gè)端點(diǎn)均在窗口內(nèi),這時(shí)線段全部落在窗口內(nèi),完全可見(jiàn),應(yīng)予 以保留。(2)線段的兩個(gè)端點(diǎn)均在窗口邊界線外同側(cè),這時(shí)線段全部落在窗口外,完全 不可見(jiàn),應(yīng)予以舍棄。(3)線段的一個(gè)端點(diǎn)在窗口內(nèi),另一個(gè)端點(diǎn)在窗口外,這時(shí)線段部分可見(jiàn),應(yīng) 求出線段與窗口邊界線的交點(diǎn),從而得到線段在窗口內(nèi)的可見(jiàn)部分。(

3、4)線段的兩個(gè)端點(diǎn)均不在窗口內(nèi),但不處于窗口邊界線外同側(cè),這時(shí)有可能線段是部分可見(jiàn)的,也可能是完全不可見(jiàn)的。Cohen-Sutherland 裁剪算法就是按照上述思路來(lái)對(duì)線段進(jìn)行裁剪的,只是在線段的兩端點(diǎn)相對(duì)于矩形窗口的位置上,巧妙地運(yùn)用了編碼的思想。首先,延長(zhǎng)窗口的四條邊界線,將平面劃分成 9 個(gè)區(qū)域,然后,用四位二進(jìn)制數(shù)C3c2C1C0t這9個(gè)區(qū)域進(jìn)行編碼,編碼規(guī)則如下:第0位CG當(dāng)線段的端點(diǎn)在窗口的左邊界之左時(shí),該位編碼為1,否則,該位編碼為0。第1位C1:當(dāng)線段的端點(diǎn)在窗口的右邊界之右時(shí),該位編碼為1,否則,該位編碼為0。第2位C2:當(dāng)線段的端點(diǎn)在窗口的下邊界之下時(shí),該位編碼為1,否則

4、,該位編碼為0。第3位C3:當(dāng)線段的端點(diǎn)在窗口的上邊界之上時(shí),該位編碼為1,否則,該位編碼為0。于是算法步驟可描述如下:步驟1:根據(jù)上述編碼規(guī)則,對(duì)線段的兩個(gè)端點(diǎn)進(jìn)行編碼。步驟2:根據(jù)線段的兩端點(diǎn)編碼判斷線段相對(duì)于窗口的位置關(guān)系,從而決定對(duì)線段如何剪取。( 1)兩端點(diǎn)編碼全為0000 時(shí),說(shuō)明線段完全位于窗口內(nèi),是完全可見(jiàn)的, 于是顯示此線段。( 2)兩端點(diǎn)編碼逐位邏輯與不為0 時(shí),說(shuō)明線段的兩個(gè)端點(diǎn)位于窗口外同側(cè),即此線段完全位于窗口外,是完全不可見(jiàn)的,于是全部舍棄,不顯示此線段。( 3)兩端點(diǎn)編碼逐位邏輯與為0 時(shí),說(shuō)明此線段或者部分可見(jiàn),或者完全不可見(jiàn)。此時(shí)需要計(jì)算出線段與窗口某一邊界線

5、或邊界線的延長(zhǎng)線的交點(diǎn),若交點(diǎn)在窗口邊界線的延長(zhǎng)線上,則說(shuō)明該線段完全位于窗口外,不予以顯示;若交點(diǎn)在窗口邊界線上,則對(duì)以其中一個(gè)交點(diǎn)為分割點(diǎn)的兩端線段,再分別對(duì)其端點(diǎn)進(jìn)行編碼,并按照上述(1)和(2)所示的方法進(jìn)行測(cè)試,從而舍棄完全位于窗口外的一段線段,保留并顯示完全位于窗口內(nèi)的一段線段。三、實(shí)驗(yàn)代碼:Cohen-SutherLand 實(shí)現(xiàn)裁剪直線的兩個(gè)關(guān)鍵函數(shù)/ 計(jì)算點(diǎn) x,y 的編碼void CCohenSutherLandView:CompOutCode(float x,float y,CRect* rect,OutCode* outCode)outCode->all = 0;o

6、utCode->top = outCode->bottom =0;if (y < rect->top)outCode->top = 1;outCode->all += 1;else if (y > rect->bottom)續(xù)頁(yè)outCode->bottom = 1;outCode->all += 1;outCode->right = outCode->left = 0;if (x > rect->right)outCode->right = 1;outCode->all += 1;else if(

7、x < rect->left)outCode->left = 1;outCode->all += 1;/Cohen-SutherLand線段裁剪算法void CCohenSutherLandView:CohenSutherLineClip(CDC* pDC,float x0,float y0,float x1,float y1, CRect* rect)BOOL accept,done;OutCode outCode0,outCode1;OutCode *outCodeOut;float x,y;accept = FALSE;done = FALSE;CompOutCo

8、de(x0,y0,rect,&outCode0);CompOutCode(x1,y1,rect,&outCode1);doif (outCode0.all = 0 && outCode1.all = 0) /完全可見(jiàn)accept = TRUE;done = TRUE;else if (outCode0.all & outCode1.all) != 0) /顯然可見(jiàn)done = TRUE;else / 進(jìn)行求交測(cè)試if (outCode0.all != 0)outCodeOut = &outCode0;elseoutCodeOut = &o

9、utCode1;if (outCodeOut->left)y = y0 + (y1 - y0) * (rect->left - x0) / (x1 - x0); /線段與窗口左邊求交x = (float)rect->left;else if (outCodeOut->top)x = x0 + (x1 - x0) * (rect->right - y0) / (y1 - y0); /線段與窗口上邊求交y = (float) rect->top;else if (outCodeOut->right)y = y0 + (y1 - x0) * (rect-&g

10、t;right - x0) / (x1 - x0); /線段與窗口右邊求交x = (float)rect->right;else if (outCodeOut->bottom)x = x0 + (x1 - x0) * (rect->bottom - x0) / (y1 - y0); /線段與窗口下邊求交y = (float)rect->bottom;if (outCodeOut ->all = outCode0.all)x0 = x; /以交點(diǎn)為界,將線段位于窗口所在的直線的外側(cè)的部分丟棄y0 = y; /剩下的繼續(xù)CompOutCode(x0,y0,rect,&outCode0);elsex1 = x;y1 = y;CompOutCode(x1,y1,rect,&outCode1); while(!done);if (accept)pDC->MoveTo(int(x0),int(y0);pDC-&g

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論