




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年寵物營養(yǎng)師考試題型介紹與試題及答案
- 加強2024年計算機基礎(chǔ)考試知識的試題及答案
- 2025年高導(dǎo)熱石墨膜合作協(xié)議書
- 2024年小學(xué)六年級語文考試準(zhǔn)備題及答案
- 2024年CPBA考試成功定義試題及答案
- 2024年計算機基礎(chǔ)考試知識提煉試題及答案
- 2025年玻璃布增強塑料項目建議書
- 2024年CPBA考試體系試題與答案
- 2024年計算機基礎(chǔ)考試重點知識試題及答案
- 2024年計算機基礎(chǔ)考試的考前復(fù)習(xí)秘籍試題及答案
- 2025年浙江省初中名校發(fā)展共同體中考語文一模試卷附參考答案
- 2025年食安食品考試題及答案
- 2025年租賃料場協(xié)議
- 2025年北森題庫測試題及答案
- 2025年必考保安證試題及答案
- 中國大唐集團有限公司陸上風(fēng)電工程標(biāo)桿造價指標(biāo)(2023年)
- 茶館里的政治:揭秘《茶館》背后的歷史
- 醫(yī)院保安服務(wù)方案投標(biāo)文件(技術(shù)方案)
- 危機公關(guān)服務(wù)合同范本
- 拆除臨時用電施工方案
- 小學(xué)數(shù)學(xué)教學(xué)中小組合作學(xué)習(xí)課件
評論
0/150
提交評論