資源描述:
《計算機圖形學裁剪技術》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、裁剪算法反走樣方法裁剪直線段裁剪點裁剪點(x,y)在窗口內的充分必要條件是:直線段裁剪假定條件矩形裁剪窗口:[xmin,xmax][ymin,ymax]待裁剪線段:直線段裁剪待裁剪線段和窗口的關系(1)完全落在窗口內(2)完全落在窗口外(3)部分在內,部分在外求交測試順序固定(左右下上)最壞情形,線段求交四次。對于那些非完全可見、又非完全不可見的線段,需要求交,求交前先測試與窗口哪條邊所在直線有交?(按序判斷端點編碼中各位的值ClCtCrCb)Cohen-Sutherland算法直線段裁剪裁剪直線段裁剪Cohen-Sutherland算法中點分割算法參數化裁剪算法Liang-Ba
2、rskey算法多邊形裁剪Sutlerland_Hodgman算法Weiler-Athenton算法字符裁剪裁剪:確定圖形中哪些部分落在顯示區(qū)之內,哪些落在顯示區(qū)之外,以便只顯示落在顯示區(qū)內的那部分圖形。這個選擇過程稱為裁剪。在進行裁剪時,畫面中對應于屏幕顯示的那部分區(qū)域稱為窗口。圖形裁剪算法,直接影響圖形系統(tǒng)的效率。裁剪點的裁剪圖形裁剪中最基本的問題。假設窗口的左下角坐標為(xL,yB),右上角坐標為(xR,yT),對于給定點P(x,y),則P點在窗口內的條件是要滿足?(xL,yB)(xR,yT)直線段裁剪直線段裁剪算法是復雜圖形裁剪的基礎。復雜的曲線可以通過折線段來近似,從而裁
3、剪問題也可以化為直線段的裁剪問題。常用的線段裁剪方法三種:Cohen-Sutherland算法中點分割算法參數化裁剪算法Cohen-Sutherland裁剪基本思想:對于每條線段P1P2分為三種情況處理:(1)若P1P2完全在窗口內,則顯示該線段P1P2。(2)若P1P2明顯在窗口外,則丟棄該線段。(3)若線段不滿足(1)或(2)的條件,則在交點處把線段分為兩段。其中一段完全在窗口外,可棄之。然后對另一段重復上述處理。如何實現上述的處理呢?實現方法:采用下面的編碼方法將窗口邊線兩邊沿長,得到九個區(qū)域,每一個區(qū)域都用一個四位二進制數標識,直線的端點都按其所處區(qū)域賦予相應的區(qū)域碼,用
4、來標識出端點相對于裁剪矩形邊界的位置。100100010101100000000100101000100110Cohen-Sutherland算法將區(qū)域碼的各位從右到左編號,則坐標區(qū)域與各位的關系為:任何位賦值為1,代表端點落在相應的位置上,否則該位為0。若端點在剪取矩形內,區(qū)域碼為0000。如果端點落在矩形的左下角,則區(qū)域碼為0101。直線段裁剪裁剪線段與窗口的關系:(1)線段完全可見;(2)顯然不可見;(3)其它提高裁剪效率:快速判斷情形(1)(2),對于情形(3),設法減少求交次數和每次求交時所需的計算量。一旦給定所有的線段端點的區(qū)域碼,就可以快速判斷哪條直線完全在剪取窗
5、口內,哪條直線完全在窗口外。Cohen-Sutherland算法若P1P2完全在窗口內code1=0,且code2=0,則“取”若P1P2明顯在窗口外code1&code2≠0,則“棄”第三種情況:在交點處把線段分為兩段。其中一段完全在窗口外,可棄之。然后對另一段重復上述處理。編碼線段裁剪Cohen-Sutherland算法Cohen-Sutherland裁減算法如何編碼呢?#defineLEFT1#defineRIGHT2#defineBOTTOM4#defineTOP8intencode(floatx,floaty){intc=0;if(x6、LEFT;if(
7、x>Xmax)c=c
8、RIGHT;if(y9、BOTTOM;if(y>Ymax)c=c
10、TOP;retrunc;}Cohen-Sutherland裁剪如何判定應該與窗口的哪條邊求交呢?編碼中對應位為1的邊。計算線段P1(x1,y1)P2(x2,y2)與窗口邊界的交點if(LEFT&code!=0){x=Xmin;y=y1+(y2-y1)*(Xmin-x1)/(x2-x1);}elseif(RIGHT&code!=0){x=Xmax;y=y1+(y2-y1)*(Xmin-x1)/(x2-x1);}elseif(BOTTOM&code!=0){y=Ymin;x=x1+
11、(x2-x1)*(Ymax-y1)/(y2-y1);}elseif(TOP&code!=0){y=Ymax;x=x1+(x2-x1)*(Ymax-y1)/(y2-y1);}void?CS_LineClip(x1,y1,x2,y2,XL,XR,YB,YT)floatx1,y1,x2,y2,XL,XR,YB,YT;//(x1,y1)(x2,y2)為線段的端點坐標,其他四個參數定義窗口的邊界{intcode1,code2,code;code1=encode(x1,y1);//對線段A端