2023年計算機圖形學(xué)實驗報告三圖形裁剪算法_第1頁
2023年計算機圖形學(xué)實驗報告三圖形裁剪算法_第2頁
2023年計算機圖形學(xué)實驗報告三圖形裁剪算法_第3頁
2023年計算機圖形學(xué)實驗報告三圖形裁剪算法_第4頁
2023年計算機圖形學(xué)實驗報告三圖形裁剪算法_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

實驗題目:實驗三圖形裁剪算法

1.實驗?zāi)康?

理解區(qū)域編碼(Regi。nCode,RC)

設(shè)計Cohen-Sutherland直線裁剪算法

編程實現(xiàn)Cohen-Sutherland直線裁剪算法

2.實驗描述:

設(shè)立裁剪窗口坐標(biāo)為:wx1=250;wxr=850;wyb=250;wyt=450;裁剪前如下圖所示:

裁剪后結(jié)果為:

3.算法設(shè)計:

Cohen-SutherIand直線裁剪算法:

假設(shè)裁剪窗口是標(biāo)準(zhǔn)矩形,由上(y=wyt)、下(y=wyb)、左(x=wxl)、右(x=wxr)四條邊

組成,如下圖所示。延長窗口四條邊形成9個區(qū)域。根據(jù)被裁剪直線的任一端點P(x,y)

所處的窗口區(qū)域位置,可以賦予一組4位二進制區(qū)域碼C4C3C2CK

wyt

窗口

\wJb

wxlwxr

100110001010

000100000010

010101000110

編碼定義規(guī)則:

第一位Cl:若端點位于窗口之左側(cè),即X<Wxl,則Cl=l,否則C1=0?

第二位C2:若端點位于窗口之右側(cè),即X>Wxr,貝IJC2=l,否則C2=0。

第三位C3:若端點位于窗口之下側(cè),即Y<Wyb,則C3=1,否則C3=0。

第四位C4:若端點位于窗口之上側(cè),即Y>Wyt,則C4=l,否則C4=0。

裁剪環(huán)節(jié):

1.若直線的兩個端點的區(qū)域編碼都為0,即RC1|RC2=O(兩者按位相或的結(jié)果為0,即R

Cl=o且RC2=0),說明直線兩端點都在窗口內(nèi),應(yīng)“簡取”。

2.若直線的兩個端點的區(qū)域編碼都不為0,即RC1&RC2#。(兩者按位相與的結(jié)果

不為0,即RC1H0且RC2W0,即直線位于窗外的同一側(cè),說明直線的兩個端點都在窗口

外,應(yīng)“簡棄”。

3.若直線既不滿足“簡取”也不滿足“簡棄”的條件,直線段必然與窗口相交,需要計算直

線與窗口邊界的交點。交點將直線分為兩段,其中一段完全位于窗口外,可“簡棄”。對另一

段賦予交點處的區(qū)域編碼,再次測試,再次求交,直至擬定完全位于窗口內(nèi)的直線段為止。

4.實現(xiàn)時,一般按固定順序左(x=wxl)、右(x=wxr)、下(y=wyb)、上(y=wyt)求解窗口

與直線的交點。

4.源程序:

//I)TestView.h

classCTestView:publicCView

protected:

odoub1ePointx[21,Pointy[2];//用戶繪制的直線

intwxl,wxr,wyb,wyt;〃左上與右下

?CDCPicture;〃內(nèi)存(預(yù)存)DC,防止屏幕閃爍

charom_i;〃第一個點還是第二個點

BOOL?m_Attatch;

=B0OLm_Draw;

?unsignedintRC,RCO.RC1;

)

2)//TestView,cpp

CTestView::CTestView()

。//窗口位置坐標(biāo)

wxl=250;wxr=850;wyb=250;wyt=450;

0m_Attatch=FALSE;

m_i=0;

?m_Draw=FALSE;

RC0=0;RC1=0;

)

voidCTestView::OnDraw(CDC*pDC)

(

oCTestDoc*pDoc=GetDocument();

ASSERT.VALID(pDoc);

〃裝載位圖

oCRectRect;

oGetC1ieniRect(&Rect);〃獲得客戶區(qū)的大小

CBitmap?Bitmap,*pBitmap;

Bitmap.LoadBitm叩(IDB_BITMAP);。

oCDCMemDC;

MemDC.CreateCompatib1eDC(GetDC());

0PBitmap=MemDC.SelectObject(&Bitmap);

MemDC.BitB1t(O,O,Rect.Width(),Rect.Height(),&Picture,0,0,SRCCOPY)?

0MemDC.TextOut((wx1+wxr)/2,wyb?20,“窗口”);〃窗口標(biāo)題

。//繪制窗口和直線

oCPenPen3,*pO1dPen3;//定義3個像素寬度的畫筆

oPen3.CreatePen(PS_SOLID,3,RGB(0,0,0));

pOldPen3=MemDC.Se1ectObject(&Pen3);

MemDC.MoveTo(wxl,wyt);MemDC.LineTo(wxr,wyt);

oMemDC.LineTo(wxr,wyb);MemDC.LineTo(wxl,wyb);

MemDC.LineTo(wx1,wyt);MemDC.Select0bject(pOIdPen3);

Pen3.Delete0bject();

oCPenPenl,*pOldPenl;//定義1個像素寬度的畫筆

oPenl.CreatePen(PS_SOLID,l,RGB(0,0,255));

叩OldPenl=MemDC.Se1ectObject(&Pen1)

?if(m_i>=l)

(

o?MemDC.MoveTo(ROUND(Pointx[0]),ROUND(Pointy[0]));

MemDC.LineTo(ROUND(Pointx[l]),ROUND(Pointy[1J))9

)

emDC.Se1ectObject(pOldPenl);

enl.De1eteObject()?

oCDC*dc=GetDC();

dc->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,S

RCCOPY);

oMemDC.SelectObject(pBitmap);

}

voidCTestView::OnMENUQip()〃裁剪菜單函數(shù)

(

0cohen();

Invalidate(FALSE);

)

unsignedintCTestView::EnCode(doubleLinePx,doub1eLinePy)〃端點編碼

函數(shù)

{〃順序左右下上

oRC=0;

"(LinePx<wxl)

。{

gRORC|LEFT;

?if(LinePx>wxr)

6{

gRORC|RIGHT;

}

?if(LinePy<wyb)

(

ooRC=RC|BOTTOM;

)

if(LinePy>wyt)

°(

。RC=RC|TOP;

°}

。returnRC;

)

voidCTestView::OnMENUDrawLine()//繪制直線菜單函數(shù)

(

//TODO:Addyourcommandhandlercodehere

if(FALSE==m_Attatch)

Picture.CreateCompatibleDC(GetDC());

CBitmap*Bitmap,*pBitmap;

。Bitmap=newCBitmap;

。出itmap->LoadBitmap(IDB_BITMAP);

。pBitmap=Picture.SelectObject(Bitmap);

m_Attatch=TRUE;

om_Draw=TRUE;

m_i=0;

Invalidate(FALSE);

oAfxGetMainWnd()->SetWindowText("案例10:Cohen-Sutherland直線裁剪算法

”);〃顯示標(biāo)題

oMessageBox(”請使用鼠標(biāo)在屏幕上繪制直線,然后點擊裁剪按鈕進行裁剪”,“提醒”,MB

_OKCANCEL);

)

voidCTestView::OnLButtonDown(UINTnFlags,CPointpoint)〃單擊鼠

標(biāo)左鍵函數(shù)

(

//TODO:Addyourmessagehandlercodehereand/orcallde

fau1t

if(TRUE==m_Draw)

(

。if(m_i<2)

(

ointx[m_i]=point.x;Pointy[m_i]=point,y;

°m_i++;

)

CView::0nLButtonDown(nF1ags,point);

)

voidCTestView::OnMouseMove(UINTnFlags,CPointpoint)〃鼠標(biāo)移動函數(shù)

(

//TODO:Addyourmessagehand1ercodehereand/orcalld

efault

if(TRUE==m_Draw)

°(

。if(m_i<2)

°(

gPointx[m_i]=point.x;Pointy[m_i]=point.y;

。Invalidate(FALSE);

00I

°)

CView::OnMouseMove(nFlags,point);

)

voidCTestView::Cohen()//Cohen-Sutherland算法

(

B0OLChange;

doublex,y;

RC0=EnCode(Pointx[O],Pointy[O]);

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

owhile(TRUE)

°{

8change=FALSE;

“f(0==(RC0IRC1))

{//簡取之

“,return;

0}

??eIseif(0!=(RC0&RC1))

。。{〃簡棄之

=return;

00}

ooe1se

°(

。“f(O=RC0)//假如PO點在窗口內(nèi),互換PO和Pl,保證pO點在窗口外

00{

加〃互換點的坐標(biāo)值

。3doub1eTPointx,TPointy;

wooTPointx=Pointx[0];TPointy=Pointy[O];

。。Pointx|0]=Pointx[1];Pointy[0]=Pointy[1];

。Pointx[l]=TPointx;Pointy[l]=TPointy;

8。//互換點的編碼值

。unsignedintTRC;

e“TRC=RCO;RC0=RC1;RC1=TRC;

?!ò醋蟆⒂?、下、上的順序裁剪

。if(RCO&LEFT)//PO點位于窗口的左側(cè)

。(

x=wx1;//求交點y

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

ointx[0]);

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

。?>Change=TRUE;

。。RCO=EnCode(Pointx[0],PointyL0]);RC1=EnCode(Pointx[l],Pointy

[I]);

6}0

。。if(RCO&RIGHT)〃PO點位于窗口的右側(cè)

0o{

。。x二wxr;〃求交點y

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

—Pointx[0]);

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

。eChange=TRUE;

。。?RCO=EnCode(Pointx[0],Pointy[0]);RCl=EnCode(Pointx[1],Pointy[1]);

00jOdd

oif(RCO&BOTTOM)//P0點位于窗口的下側(cè)

°(

。y二wyb;〃求交點x

AX二Pointx[0]+(Pointx[l]-Pointx[0])*(y-Pointy[O])/(Pointy[l]-Pointy[0]);

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

Change=TRUE;

osRC0=EnCode(Pointx[0],Pointy[O]);RC1=EnCode(Pointx[1],Pointy[11);

DOJ6

8if(RC0&TOP)//P0點位于窗口的上側(cè)

(

。y=wyt;//求交點x

_

MMx=Pointx[0]+(Pointx[l]-Pointx[01)*(y-Pointy[0])/(Pointy[l]Pointy[0]);

gPointx[0]=x;Pointy[O]=y;

Change=TRUE;

aRC0=EnCode(Pointx[0],Pointy[O]);RC1=EnCode(Pointx[l],Pointy[1]);

6}

。if(FALSE==Change)

bO{

?return;

5.運營結(jié)果:(屏幕截圖)

無標(biāo)題-Test

文件更)0WS盤)查看9幫助W繪圖

口今口昌e

溫馨提示

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

評論

0/150

提交評論