狠狠干影院/欧美午夜电影在线观看/高黄文/国产精品一区二区在线观看完整版

直線段剪裁實驗報告

| 瀏覽次數:

 《計算機圖形學》實驗報告

 《實驗名稱》

 直線段裁剪 姓名

 學號

  專業

 班級

  天津大學計算機科學與技術學院 一、實驗目得 熟練掌握 Cohen—Sutherland 直線裁剪算法,并編程實現 二、實驗內容 (1)

 裁剪窗口為矩形窗口,且矩形邊與坐標軸平行,長寬自己定。

 (2)

 待裁剪線段端點坐標自己定;裁剪線段涵蓋完全可見、不完全可見、完全不可見類型。

 (3)

 要求顯示待裁剪線段并用不同顏色標示出裁剪結果。

 實現方法:一般情況下,需要判斷一條直線就是全部可見,全部不可見,部分裁剪(一段裁剪),全部裁剪(兩端裁剪).通過把裁剪區域分成許多部分,然后給每一段被裁剪得線段得兩端分配一位代碼,通過少量if語句與一個case語句就可以判斷出具體情況。

  偽代碼如下: #define CLIP_CODE_C 0

 0000x?#define CLIP_CODE_N 0

 8000x?#define CLIP_CODE_S

 0x0004 #define CLIP_CODE_E

 0x0002 #define CLIP_CODE_W

 0x0001 #define CLIP_CODE_NE 0

 a000x?#define CLIP_CODE_SE 0

 6000x?#define CLIP_CODE_NW 0

 9000x?#define CLIP_CODE_SW 0

 5000x? 實驗步驟:

 1)生成裁剪窗口,窗口由直線 xl=250,xr=850,yb=250,yt=450 2)繪制直線段

 3)編寫 Cohen—Sutherland 直線裁剪算法,對直線段進行裁剪 編碼定義規則:

 第一位 C1:若端點位于窗口之左側,即 X<xl,則 C1=1,否則 C1=0。

 第二位 C2:若端點位于窗口之右側,即 X〉xr,則 C2=1,否則 C2=0。

 第三位 C3:若端點位于窗口之下側,即 Y〈yb,則 C3=1,否則 C3=0。

 第四位 C4:若端點位于窗口之上側,即 Y>yt,則 C4=1,否則 C4=0. 裁剪步驟: 對所有直線得端點都建立了區域碼之后,就可按區域碼判斷直線在窗口之內或窗口之外。這可分為如下幾種情況:

 ①若一直線得兩個端點得區域碼均為0000 則此直線在窗口邊界之內,應子保留。

 ②若一直線得兩個端點得區域碼得同一位同時為 1,則此直線全部在窗口邊界之外,應子裁剪。例如,若一直線得一個端點得區域碼為 1001,另一個端點得區域碼為 0101,則此兩端點得區域碼得第一位均為1,說明此兩端點均在窗口邊界之左,因此,直線在窗口邊界之外,應予裁剪。可用將直線兩個端點得區域碼進行與操作得方法,判斷直線就是否在窗口之外,若與操作得結果為0000則兩端點得區域碼任何位均不同時為1此直線不一定被裁剪。

 ③以上兩種情況之外得直線,有可能穿過窗口,也有可能不穿過窗口,

 下圖中所示得兩條直線都不符合情況②得要求,但一條直線(P1P2)穿過窗口,另一直線(P3P4)不穿過窗口。對這類直線可以進行如下處理:取窗口外得一個端點與窗口邊界比較以確定可排除直線得哪一部分,然后,把直線剩下得部分與其她邊界比較,這樣一直到直線全部被排除或確定直線得哪一部分在窗口之內為止。可按“左、右、下、上”得次序建立檢查直線端點與窗口邊界關系得算法。

 圖③ 三、實驗結果

  畫線效果一:

  畫線效果二:

  其她效果用戶可自行繪制 四、實驗分析與總結 掌握了openGL得基本用法,掌握了Cohen—Sutherland直線裁剪算法,并編程實現出來、 五、源代碼 void CCsLineView::Cohen()//Cohen-Sutherland 算法 {

  ;egnahC LOOB?

 ;y,x elbuod? RC0=EnCode(Pointx[0],Pointy[0]);

 RC1=EnCode(Pointx[1],Pointy[1]);

  )EURT(elihw? {

  Change=FALSE;

  ))1CR|0CR( == 0(fi?//{ ?

 之取簡?

 ? return;

 } ? ?

 else if(0!=(RC0 & RC1))

 //{

 之棄簡?

 ? return;

 } ? ? ?

 esle?

 {

 外口窗在點 0p 證保,1P與0P 換交,內口窗在點 0P 果如//)0CR==0(fi? { ? ? ?

 //

 值標坐得點換交?

  ? double TPointx,TPointy;

  ?

  ;]0[ytnioP=ytnioPT;]0[xtnioP=xtnioPT?

 ?

  ;]1[ytnioP=]0[ytnioP;]1[xtnioP=]0[xtnioP?

  ?

 ;ytnioPT=]1[ytnioP;xtnioPT=]1[xtnioP? ? ? //

 值碼編得點換交?

 unsigned int TRC;

  ?

 ;CRT=1CR;1CR=0CR;0CR=CRT?

  } ?// ? ?

 剪裁序順得上、下、右、左按? ? ?

 側左得口窗于位點 0P//) TFEL & 0CR(fi?

 ? {

  ? ?

 y 點交求//;lxw=x? ? ?

 nioP(/)]0[xtnioP-x(*)]0[ytnioP—]1[ytnioP(+]0[ytnioP=y?tx[1]-Pointx[0]);

 ;y=]0[ytnioP;x=]0[xtnioP? ? ? ?

 ;EURT=egnahC?

  ? ?

 RC0=EnCode(Pointx[0],Pointy[0]);RC1=EnCode(Pointx[1],Pointy[1]);

 ? ?} ?

 ?

 側右得口窗于位點0P//) THGIR & 0CR(fi?

  {

 ? ?

 y點交求//;rxw=x?

 ?

 y=Pointy[0]+(Pointy[1]-Pointy[0])*(x—Pointx[0])/(Pointx[1]-Pointx[0]);

 ? ?

 Pointx[0]=x;Pointy[0]=y;

 ? ?

 ;EURT=egnahC?

  ? tnioP,]1[xtnioP(edoCnE=1CR;)]0[ytnioP,]0[xtnioP(edoCnE=0CR?y[1]);

  ? ? ?} ? ?

 側下得口窗于位點 0P//) MOTTOB & 0CR(fi? { ? ? ? ? ?

  x 點交求//;byw=y?

  ? x=Pointx[0]+(Pointx[1]—Pointx[0])*(y-Pointy[0])/(Pointy[1]-Pointy[0]);

 ? Pointx[0]=x;Pointy[0]=y;

  ?

 ;EURT=egnahC?

  ? RC0=EnCode(Pointx[0],Pointy[0]);RC1=EnCode(Pointx[1],Pointy[1]);

  } ? ?

  ?

 ? if(RC0 & TOP )//P0 點位于窗口得上側

 { ?

 x 點交求//;tyw=y? ? ? ? nioP(/)]0[ytnioP—y(*)]0[xtnioP-]1[xtnioP(+]0[xtnioP=x?

 ty[1]—Pointy[0]);

 ;y=]0[ytnioP;x=]0[xtnioP?

 ? ?

 ;EURT=egnahC?

 ? oP,]1[xtnioP(edoCnE=1CR;)]0[ytnioP,]0[xtnioP(edoCnE=0CR?inty[1]);

  ? }

  ? if(FALSE==Change)

 { ? ?

 ? ? return;

 }? ?

  } ? } ?} void CCsLineView::OnDraw(CDC* pDC)

 {

 CRect Rect;

 GetClientRect(&Rect);//獲得客戶區得大小

 CBitmap Bitmap,*pBitmap;

 ;)1PAMTIB_BDI(pamtiBdaoL、pamtiB? CDC MemDC;

  ;))(CDteG(CDelbitapetaerC、CDmeM?

 ;)pamtiB&(tcejbOtceleS、CDmeM=pamtiBp? S,0,0,erutciP&,)(thgieH、tceR,)(htdiW、tceR,0,0(tlBtiB、CDmeM?RCCOPY);

 題標口窗//;)"口窗",02-byw,2/)rxw+lxw((tuOtxeT、CDmeM? //繪制窗口與直線

  CPen Pen3,*pOldPen3;//定義3個像素寬度得畫筆

  ;))0,0,0(BGR,2,DILOS_SP(nePetaerC、3neP?

 ;)3neP&(tcejbOtceleS、CDmeM=3nePdlOp? MemDC、MoveTo(wxl,wyt);MemDC、LineTo(wxr,wyt);

  ;)byw,lxw(oTeniL、CDmeM;)byw,rxw(oTeniL、CDmeM? MemDC、LineTo(wxl,wyt);MemDC、SelectObject(pOldPen3);

 Pen3、DeleteObject();

 CPen Pen1,*pOldPen1;//定義 1 個像素寬度得畫筆

 Pen1、CreatePen(PS_SOLID,2,RGB(255,0,0));

 ;)1neP&(tcejbOtceleS、CDmeM=1nePdlOp? if(m_i>=1)

 { ? ?

 ;))]0[ytnioP(DNUOR,)]0[xtnioP(DNUOR(oTevoM、CDmeM?

 ? ;))]1[ytnioP(DNUOR,)]1[xtnioP(DNUOR(oTeniL、CDmeM? ?

  } ? MemDC、SelectObject(pOldPen1);

 Pen1、DeleteObject(); ?

 ;)(CDteG=cd* CDC? RS,0,0,CDmeM&,)(thgieH、tceR,)(htdiW、tceR,0,0(tlBtiB〉—cd?CCOPY);

  ;)pamtiBp(tcejbOtceleS、CDmeM?} void CCsLineView::Ondrawline() //屏幕畫線函數 {

  if(FALSE==m_Attatch)

  { ? ?

 ;))(CDteG(CDelbitapetaerC、erutciP?

 *pamtiBC?

 ;pamtiBp*,pamtiB?

 Bitmap=new CBitmap;

 ;)1PAMTIB_BDI(pamtiBdaoL>-pamtiB?

  ;)pamtiB(tcejbOtceleS、erutciP=pamtiBp?

  ;EURT=hctattA_m? }

 m_Draw=TRUE;

  ;0=i_m?

 ;)ESLAF(etadilavnI? 示顯//;)"法算剪裁線直 dnalrehtuS—nehoC"(txeTwodniWteS〉-)(dnWniaMteGxfA?標題

 MessageBox("請使用鼠標在屏幕上繪制直線,然后點擊裁剪按鈕進行裁剪”,”提示",MB_OKCANCEL); ?} void CCsLineView::OnMouseMove(UINT nFlags, CPoint point)

 //鼠標移動函數 {

 // TODO: Add your message handler code here and/or call default

 if(TRUE==m_Draw)

 { ?

 )2<i_m(fi? { ? ?

 ? Pointx[m_i]=point、x;Pointy[m_i]=point、y;

  ? Invalidate(FALSE);

  } ? }

  ;)tniop ,sgalFn(evoMesuoMnO::weiVC?} void CCsLineView::OnLButtonDown(UINT nFlags, CPoint point) //單擊鼠標左鍵函數 {

 ?

 )warD_m==EURT(fi? {

  )2〈i_m(fi?

 {

 Pointx[m_i]=point、x;Pointy[m_i]=point、y;

 ? ? m_i++;

 } ? } ?

 ;)tniop ,sgalFn(nwoDnottuBLnO::weiVC?}

推薦訪問: 線段 剪裁 實驗

【直線段剪裁實驗報告】相關推薦

工作總結最新推薦

NEW