直線段剪裁實驗報告_第1頁
直線段剪裁實驗報告_第2頁
直線段剪裁實驗報告_第3頁
已閱讀5頁,還剩7頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、計算機圖形學實驗報告實驗名稱直線段裁剪姓名學號專業班級天津大學計算機科學與技術學院、實驗目得熟練掌握 C henSutherland 直線裁剪算法,并編程實現、實驗內容(1) 裁剪窗口為矩形窗口 , 且矩形邊與坐標軸平行 ,長寬自己定。(2) 待裁剪線段端點坐標自己定 ; 裁剪線段涵蓋完全可見、不完全可見、 完全不可見類型。(3 ) 要求顯示待裁剪線段并用不同顏色標示出裁剪結果。實現方法 : 一般情況下 , 需要判斷一條直線就是全部可見,全部不可見 , 部分裁剪(一段裁剪) ,全部裁剪(兩端裁剪). 通過把裁剪區域分成許多部分 , 然后給每一段被裁剪得線段得兩端分配一位代碼 ,通過少量 if

2、語句與一個 ase語句就可以判斷出具體情況。偽代碼如下 :#define CL _CODE_C0 ? 0000dfine CLIP_CDE_N 0? 008defi CLIP COE_S 0x0004 deine CLIP_COE_ x002#defin CLI _CODE_W 0x001dfine CLI_C E_E ? x000a#df n LIP_CODE_SE0 ? x000#df ne LP_C _ 0? 009 #define LI _CODE_ W 0? x000實驗步驟:1)生成裁剪窗口,窗口由直線 xl=250 ,xr 5,yb=250,yt=450) 繪制直線段3)編寫 C

3、ohenSthelad直線裁剪算法 ,對直線段進行裁剪 編碼定義規則:第一位 C1:若端點位于窗口之左側 , 即 X<xl ,則 C1 1,否則 1=。第二位 C: 若端點位于窗口之右側,即 Xxr, 則 C2=, 否則 C2=0。第三位 C3:若端點位于窗口之下側,即 Y yb,則 C3=1,否則 C3=0。 第四位 C4:若端點位于窗口之上側,即 Y>y,則 C41,否則 C4=0. 裁剪步驟 :對所有直線得端點都建立了區域碼之后,就可按區域碼判斷直線在窗口 之內或窗口之外。這可分為如下幾種情況: 若一直線得兩個端點得區域碼均為 000 則此直線在窗口邊界之內 , 應子保留。

4、若一直線得兩個端點得區域碼得同一位同時為 1,則此直線全部在窗 口邊界之外 ,應子裁剪。例如 , 若一直線得一個端點得區域碼為 1001,另一個 端點得區域碼為 0101,則此兩端點得區域碼得第一位均為 , 說明此兩端點 均在窗口邊界之左,因此 , 直線在窗口邊界之外,應予裁剪??捎脤⒅本€兩 個端點得區域碼進行與操作得方法 , 判斷直線就是否在窗口之外,若與操作 得結果為 0000 則兩端點得區域碼任何位均不同時為此直線不一定被裁剪。 以上兩種情況之外得直線 , 有可能穿過窗口,也有可能不穿過窗口 , 下圖中所示得兩條直線都不符合情況得要求 , 但一條直線( 1P)穿過 窗口, 另一直線 (P

5、P)不穿過窗口。對這類直線可以進行如下處理:取窗 口外得一個端點與窗口邊界比較以確定可排除直線得哪一部分,然后,把直 線剩下得部分與其她邊界比較 , 這樣一直到直線全部被排除或確定直線得哪 一部分在窗口之內為止??砂础白蟆⒂?、下、上”得次序建立檢查直線端點 與窗口邊界關系得算法。圖三、實驗結果畫線效果一 :畫線效果二 :其她效果用戶可自行繪制四、實驗分析與總結掌握了 penL得基本用法 ,掌握了 Chen herlan 直線裁剪算 法, 并編程實現出來、五、源代碼vid C ineVi w:Co en( ) / Coh -S therland 算法B O Change; oubl , ;RC0

6、= C de( o ntx 0 ,Poin y0 );RC =E od( Poin x 1,Pointy 1);hil (R )C ange FALSE;? ( 0 = ( C0| C1)? ? / 簡取之 urn;?els f( !=(RC0 & R1)? / 簡棄之re urn;? ? ? elsef(0=RC0 )/ 如果 P0點在窗口內,交換 P與 1,保證 p0點在窗口外?/ 交換點得坐標值 uble Pin x, Po nty;TPo ntx=Po nt 0 ; in y=Pointy ;Poi tx =Point 1; nt =Pointy ;? Poin 1 =TPoi

7、n x;Poi t 1=TPoin ;/ 交換點得編碼值u signe int R ;TC C ; C=RC1;RC1=RC;? ? ? /按左、右、下、上得順序裁剪f(RC0 & LEF )/P0 點位于窗口得左側? x=wxl; / 求交點 yx ? =Poi ty0 +(Poi y 1 o nty0) ( oint 0)/(Po n -P int 0 );? oint =x; oi ty0 =;han e=TR ;? ? C =EnCode( oi x 0, oin y );RC1= nCod(P tx 1 ,Pointy );? ? ? if (R RGHT )/P 點位于窗口

8、得右側x= xr; 求交點y= nty ( oint -P int 0 ) * ( Point0)/(Pointx - intx0) int 0= ;Pointy0 y;? ? C nge=TR;? ? RC0=E oe(Poin x0,Ponty0 );RC =EnCode(Point 1 ,Pont1 );? ? ? ifRC0 & BOT OM )/P0點位于窗口得下側? wyb;求交點x= ointx +(P intx1 Pointx0) ( -Poi y0 )/(Pointy1-Pointy) ;Poin x0 =; Pointy0=y;? C an e=TRU;RC0=E

9、ode(Po ntx0, in y );RC1 EnCod (Pointx Pointy ) ;?f ( C & TOP )/P0 點位于窗口得上側? =wy ;/ 求交點 x? ? ? ? x Pointx +(Poin x -P i tx0 ) (y ointy0) (Pity1 inty0 );P intx 0= ;Poin 0 =y;? ? ? Chang T UE;? ? R0=Enod(Pontx0,P inty0 ) ;RC1=EnCod (oin x1 , inty1) ;if (FALSE =Chang)? ? return;? ? ?vo C s ine iew:

10、: Draw(CC* p C)CR t e; etClie tRect ( & ect);/ 獲得客戶區得大小 Bi map itm p, itmap ;? tma、 LoadBit p( IDB_BITMA 1);CDMe DC;Me DC、 r aepatibleD ( GetDC() ;pB tmap MemD、C Se ctOb c (&Bit a)? emDC、BitBlt(0,0,et、id h(), R t 、 ei ht() , Pi ture ,CCOY);? emD、 Tex t ( ( l+wxr ) 2, w b-20 ,窗口 " ) ;/ 窗

11、口標題,0,S/ 繪制窗口與直線CPn n,*p ld en3;/ 定義個像素寬度得畫筆? Pn3、 re eP n(PS_ LD,GB(0,0,);? Old en = emDC、 ele Obje t( Pe3); em、 M veTo(w ,wyt ); emDC、Lneo(wxr , wyt);? Mem、 Li o(wxr,wy ) ; e DC、L n To( wxl , wb);emC、Li T( wxl,w t) ; emDC、SelectObject( OldPe 3); n3、 Del teO ec() ;CPe Pen,*OlPen1;/ 定義 1 個像素寬度得畫筆 n1

12、、Creat Pn(PSSOLID, ,RGB(25,0,0 );? pOldPen1=MemD、 ele bect ( Pen1) ;if( i> 1)? ? MemD、C eTo( OUND( o x0 ),RO ND( oi y 0 );? MemC、LineTo(ROUN(Pontx1 ),R D(Poiny1) );? ? ? e DC、S l ct bject ( pOld en1);P n1、 Del eObjec (); ? C *d =GetDC( ) ;? dcBtBt(0,0,ect、 th( ),Ret、Hght(),&MmD,0, ,S CC PY);?

13、 M mDC、 elect t(pB tma );voi CCsLi eView: : d a line () / 屏幕畫線函數 (FALSE=m tt tch)? ic ur 、 Createpa ibleDC(G DC() );? CBi ap? itmap,*p itm p ;B tmap new CBi map;? Bi map->LoadBitma (I _BIT AP1);? pBitma =Pi t re 、 Selec Object (B map);? m_tt tch RU;m r w=TRUE;? m_i=0;? Inv idate(F L E);? AfxG tMa

14、i Wnd()- Set in owText( "C hen Sutherland 直線裁剪算法 ");/ 顯示 標題MessageB (" 請使用鼠標在屏幕上繪制直線, 然后點擊裁剪按鈕進行裁剪” , ”提示 ,MB_OKCANC L); ?voi CCsLineV e: nMouse ov (UI T nFlag , CPo nt p int) 鼠標移 動函數/ TO : Add you mss ge andler c de here n/or call dfaultif ( TR =_Draw)? if ( _i < 2)?Poi txm_i= ont 、 x; oint m_i =pont 、;? Invalidate

溫馨提示

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

評論

0/150

提交評論