資源描述:
《實(shí)驗(yàn)三圖形裁剪算法實(shí)現(xiàn)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、實(shí)驗(yàn)三圖形裁剪算法實(shí)現(xiàn)實(shí)驗(yàn)學(xué)時(shí):2學(xué)時(shí)實(shí)驗(yàn)類型:驗(yàn)證型實(shí)驗(yàn)要求:必修在使用計(jì)算機(jī)處理圖形信息吋,計(jì)算機(jī)內(nèi)部存儲(chǔ)的圖形往往比較大,而屏幕顯示的只是閣的一部分。因此需要確定閣形中哪些部分落在顯示區(qū)之(Al,哪些落在顯示區(qū)之外,以使只顯示落在顯示區(qū)內(nèi)的那部分圖形。這個(gè)選擇過程稱為裁剪。最簡(jiǎn)單的裁剪方法是把各種圖形掃描轉(zhuǎn)換為點(diǎn)之盾,再判斷各點(diǎn)是否在窗內(nèi)。但那樣太費(fèi)時(shí),一般不可取。這是因?yàn)閮有╅w形紺成部分全部在窗UI外,可以完全排除,不必進(jìn)行掃描轉(zhuǎn)換。所以一般采川先裁剪再掃描轉(zhuǎn)換的方法,多邊形裁剪示意圖,如圖1-1所示。(a)裁剪前(b)裁剪后圖1-1多邊形裁剪示意圖直線裁剪1.直線和窗口的
2、關(guān)系直線和窗U的關(guān)系如圖1-2所示,可以分為如卜*3類:(1)整條直線在窗口內(nèi)。此時(shí),不需剪裁,顯示整條直線。(2)整條且線在窗口外,此時(shí),不需剪裁,不顯示整條K線。(3)部分直線在窗口內(nèi),部分直線在窗U外。此吋,需耍求出直線與窗框的交點(diǎn),并將窗口外的直線部分剪裁棹,顯示窗口內(nèi)的直線部分。直線剪裁算法冇兩個(gè)主要步驟。首先將不需剪裁的且線挑出,即刪去在窗外的直線。然后,對(duì)其余宜線,逐條與窗框求交點(diǎn),并將窗口外的部分刪去。2.Cohen-Sutherland直線剪裁算法以區(qū)域編碼為基礎(chǔ),將窗口及其周圍的8個(gè)方向以4bit的二進(jìn)制數(shù)進(jìn)行編碼。如圖1-3所示的編碼方法將窗UI及其鄰域分為5
3、個(gè)區(qū)域。(1)內(nèi)域:區(qū)域(0000)。(2)上域:區(qū)域(1001,1000,1010)。(3)下域:區(qū)域(0101,0100,0110)。(4)左域:區(qū)域(1001,0001,0101)。100110001010000100000010010101000110P,圖1-3WlI及M鄰域的5個(gè)區(qū)域及與肖線的關(guān)系(5)心域:區(qū)域(1010,0010,0110)。當(dāng)線段的兩個(gè)端點(diǎn)的編碼的邏輯“與”非零時(shí),線段妯然為不可見的。對(duì)某線段的兩各端點(diǎn)的區(qū)號(hào)進(jìn)行位與運(yùn)算,可知這兩個(gè)端點(diǎn)是否同在視區(qū)的上、下、左、右。算法的主要思想是,對(duì)每條直線,如P,P2利用以下步驟進(jìn)行判斷:①對(duì)直線兩端點(diǎn)編碼分別
4、記為C,(P,)={6/,,Z?hChJ,},C2(P2)={6Z2,b2,c2,么}其中,at、bi、d、式取值范圍為{l,0},/e{l,2}o②如果則顯示整條直線,取出下一條直線,返回步驟①;否則,進(jìn)入步驟③。③如果
5、1=1,則求直線與窗上邊的交點(diǎn),并刪去交點(diǎn)以上部分。如果
6、Z?2I=1?ICi—C*2
7、=1,丨d—d2
8、=1>進(jìn)什類似處理。④返回步驟①判斷K一條直線。多邊形裁剪多邊形裁剪算法的關(guān)鍵在于,通過剪裁,要保持窗uA多邊形的邊界部分,而且要將窗框的冇關(guān)部分按一定次序插入多邊形的保貿(mào)邊界之間,從而使剪裁后的多邊形的邊仍然保持封閉狀態(tài),以便填色算法得以正確實(shí)現(xiàn),多邊形
9、裁剪原理示意閣,如閣1-4所示。(b)按直線剪裁的多邊形圖1-4多邊形裁剪原理示意圖I(c)按多邊形剪裁后的多邊形(1)Sutherland-Hodgman算法思路:將多邊形的各邊先相對(duì)于窗U的某一條邊界進(jìn)行裁剪,然后將裁剪結(jié)果再與另一條邊界進(jìn)行裁剪,如此重復(fù)多次,便可得到最終結(jié)果。(2)實(shí)現(xiàn)方法:①設(shè)置兩個(gè)表。輸入頂點(diǎn)表(向量)——用于存放被裁剪多邊形的頂點(diǎn)輸出頂點(diǎn)表(線性鏈表)——用于存放裁剪過程中叫結(jié)果的頂點(diǎn)②輸入頂點(diǎn)表中各頂點(diǎn)要求按一定順序排列,一般可采用順時(shí)針或逆時(shí)針方向。③相對(duì)于裁剪窗口的各條邊界,按頂點(diǎn)表中的順序,逐邊進(jìn)行裁剪。(3)具體操作步驟如下:①P,?若位于邊
10、界線的可見一側(cè),則P,?送給輸出頂點(diǎn)表。②P,?若位于邊界線的不對(duì)見一側(cè),則將其舍棄。③除第一個(gè)頂點(diǎn)外,還要檢查每一個(gè)P,?和前一?頂點(diǎn)Py是否位于窗口邊界的同一?側(cè),若不在同一側(cè),則需計(jì)算出交點(diǎn)送給輸出頂點(diǎn)表。④最后一個(gè)頂點(diǎn)則還要與A—起進(jìn)行同樣的檢杏。如下閣1-6所示,是上述多邊形裁剪的原理示意閣。圖1-6多邊形裁剪原現(xiàn)示意圖2似q3Q圖形裁剪編程1.程序設(shè)計(jì)功能說明如圖1-7所示為圖形裁剪的實(shí)用程序運(yùn)行時(shí)的主界Iftf,首先根裾界側(cè)提示,在用戶區(qū)雙擊,出現(xiàn)所需要裁剪的各種線段,再單擊菜單中“閣形裁剪”,可選擇其下拉菜單的各閣形裁剪選項(xiàng)完成各種圖形裁剪(在窗U中紅矩形框外的線
11、段或多邊形被裁減掉)。圖1-7“圖形裁剪”程序主界面1.程序設(shè)計(jì)步驟程序“閣形裁剪”的設(shè)計(jì)步驟如不:(1)創(chuàng)建工程名稱為“圖形裁剪”單文檔應(yīng)用程序框梁(參看上面單文檔應(yīng)用程序框架的建立)。(2)編輯菜單資源。圖1-8圖形裁剪切界面設(shè)計(jì)如圖1-8所示的菜雄項(xiàng)。在工作區(qū)的ResourceView標(biāo)簽屮,單擊Menu項(xiàng)左邊“+”,然后雙擊其子項(xiàng)IDR.MAINFRAME,并根裾表1-9中的定義編輯菜單資源。表1-9菜單資源表菜單標(biāo)題菜單項(xiàng)標(biāo)題標(biāo)示符ID圖形裁剪線段裁剪ID.