《計算機圖形學》實驗報告
《實驗名稱》
直線段裁剪 姓名
學號
專業
班級
天津大學計算機科學與技術學院 一、實驗目得 熟練掌握 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?}
推薦訪問: 線段 剪裁 實驗在偉大祖國73華誕之際,我參加了單位組織的“光影鑄魂”主題黨日活動,集中觀看了抗美援朝題材影片《長津湖》,再一次重溫這段悲壯歷史,再一次深刻感悟偉大抗美援朝精神。1950年10月,新中國剛剛成立一年,
根據省局黨組《關于舉辦習近平談治國理政(第四卷)讀書班的通知》要求,我中心通過專題學習、專題研討以及交流分享等形式,系統的對《習近平談治國理政》(第四卷)進行了深入的學習與交流,下面我就來談一談我個人
《習近平談治國理政》(第四卷)是在百年變局和世紀疫情相互疊加的大背景下,對以習近平同志為核心的黨中央治國理政重大戰略部署、重大理論創造、重大思想引領的系統呈現。它生動記錄了新一代黨中央領導集體統籌兩個
《真抓實干做好新發展階段“三農工作”》是《習近平談治國理政》第四卷中的文章,這是習近平總書記在2020年12月28日中央農村工作會議上的集體學習時的講話。文章指出,我常講,領導干部要胸懷黨和國家工作大
在《習近平談治國理政》第四卷中,習近平總書記強調,江山就是人民,人民就是江山,打江山、守江山,守的是人民的心。從嘉興南湖中駛出的小小紅船,到世界上最大的執政黨,在中國共產黨的字典里,“人民”一詞從來都
黨的十八大以來,習近平總書記以馬克思主義戰略家的博大胸襟和深謀遠慮,在治國理政和推動全球治理中牢固樹立戰略意識,在不同場合多次圍繞戰略策略的重要性,戰略和策略的關系,提高戰略思維、堅定戰略自信、強化戰
《習近平談治國理政》第四卷集中展示了以習近平同志為核心的黨中央在百年變局和世紀疫情相互疊加背景下,如何更好地堅持和發展中國特色社會主義而進行的生動實踐與理論探索;對于新時代堅持和發展什么樣的中國特色社
在黨組織的關懷下,我有幸參加了區委組織部組織的入黨積極分子培訓班。為期一周的學習,學習形式多樣,課程內容豐富,各位專家的講解細致精彩,對于我加深對黨的創新理論的認識、對黨的歷史的深入了解、對中共黨員的
《習近平談治國理政》第四卷《共建網上美好精神家園》一文中指出:網絡玩命是新形勢下社會文明的重要內容,是建設網絡強國的重要領域。截至2021年12月,我國網民規模達10 32億,較2020年12月增長4
剛剛召開的中國共產黨第十九屆中央委員會第七次全體會議上討論并通過了黨的十九屆中央委員會向中國共產黨第二十次全國代表大會的報告、黨的十九屆中央紀律檢查委員會向中國共產黨第二十次全國代表大會的工作報告和《