計算機圖形學實驗CohenSutherland算法_第1頁
計算機圖形學實驗CohenSutherland算法_第2頁
計算機圖形學實驗CohenSutherland算法_第3頁
計算機圖形學實驗CohenSutherland算法_第4頁
計算機圖形學實驗CohenSutherland算法_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實驗5-6一、實驗題目請按照圖5-32所示,使用對話框輸入直線段的起點和終點坐標。在屏幕客戶區左側區域繪制輸入直線段和“窗口”,在屏幕客戶區右側區域繪制“視區”并輸出裁剪結果。這里需要用到窗視變換公式。請使用Cohen-Sutherland算法編程實現。二、實驗思想 Cohen-Sutherland直線裁剪算法是最早流行的編碼算法。每條直線的端點都被賦予一組四位二進制代碼,稱為區域編碼(Region Code,RC),用來標識直線端點相對于窗口邊界及其延長線的位置。假設窗口是標準矩形,由上(y=wyt)、下(y=wyb)、左(x=wxl)、右(x=wxr)四條邊組成,如圖5-23所示。延長窗口

2、四條邊形成9個區域,如圖5-24所示。這樣根據直線的任一端點P(x,y)所處的窗口區域位置,可以賦予一組4位二進制區域碼RCC4C3C2C1。 為了保證窗口內直線端點的編碼為零,編碼規則定義如下: 第一位:若端點位于窗口之左側,即x<wxl ,則C1=1,否則C1=0。 第二位:若端點位于窗口之右側,即x>wxr,則C2=1,否則C2=0。 第三位:若端點位于窗口之下側,即y<wyb,則C3=1,否則C3=0。 第四位:若端點位于窗口之上側,即y>wyt,則C4=1,否則C4=0。裁剪步驟如下:(1)若直線的兩個端點的區域編碼都為零,即RC1|RC2=0,說明直線兩端點

3、都在窗口內,應“簡取”之。(2)若直線的兩個端點的區域編碼都不為零,即RC1&RC20,即直線位于窗外的同一側,說明直線的兩個端點都在窗口外,應“簡棄”之。(3)若直線既不滿足“簡取”也不滿足“簡棄”的條件,直線必然與窗口或窗口邊界的延長線相交,需要計算直線與窗口邊界的交點。交點將直線分為兩段,其中一段完全位于窗口外,可“簡棄”之。對另一段重復進行上述處理,直至該直線段完全被舍棄或找到完全位于窗口內的直線段為止。三、程序代碼void CTestView:clip(double xw1,double yw1,double xw2,double yw2)/裁剪函數double xv1,yv

4、1,xv2,yv2;double x,y;BOOL Change;CClientDC dc(this);RC1=EnCode(xw1,yw1);RC2=EnCode(xw2,yw2);while(TRUE)Change=FALSE;if( (RC1 | RC2)=0)/簡取之xv1=a*xw1+b;yv1=c*yw1+d;xv2=a*xw2+b;yv2=c*yw2+d;/計算視區坐標dc.MoveTo(ROUND(xv1),ROUND(yv1);dc.LineTo(ROUND(xv2),ROUND(yv2);return;else if(RC1 & RC2)!=0)/簡棄之return

5、;elseif(RC1=0)/如果P1點在窗口內,交換P1和P2,保證p1點在窗口外/交換點的坐標值double tx,ty;tx=xw1;ty=yw1;xw1=xw2;yw1=yw2;xw2=tx;yw2=ty;/交換點的編碼值unsigned int RC;RC=RC1;RC1=RC2;RC2=RC;if(RC1 & LEFT )/P1點位于窗口的左側x=wxl;y=yw1+(yw2-yw1)*(x-xw1)/(xw2-xw1);xw1=x;yw1=y;Change=TRUE;RC1=EnCode(xw1,yw1);RC2=EnCode(xw2,yw2);if(RC1 &

6、RIGHT )/P1點位于窗口的右側x=wxr;y=yw1+(yw2-yw1)*(x-xw1)/(xw2-xw1);xw1=x;yw1=y;Change=TRUE;RC1=EnCode(xw1,yw1);RC2=EnCode(xw2,yw2);if(RC1 & BOTTOM )/P1點位于窗口的下側y=wyb;x=xw1+(xw2-xw1)*(y-yw1)/(yw2-yw1);xw1=x;yw1=y;Change=TRUE;RC1=EnCode(xw1,yw1);RC2=EnCode(xw2,yw2);if(RC1 & TOP )/P1點位于窗口的上側y=wyt;x=xw1+(xw2-xw1)*(y-yw1)/(yw2-yw1);xw1=x;yw1=y;Change=TRUE;RC1=EnCode(xw1,yw1);RC2=EnCode(xw2,yw2);if(Change=FALSE)return;unsigned int CTestView:EnCode(double x,double y)/編碼函數/順序左右下上unsigned int RC=0;if(x<wxl)RC=

溫馨提示

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

評論

0/150

提交評論