計算機圖形學(xué)實驗課件_第1頁
計算機圖形學(xué)實驗課件_第2頁
計算機圖形學(xué)實驗課件_第3頁
計算機圖形學(xué)實驗課件_第4頁
計算機圖形學(xué)實驗課件_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2022/8/101計算機圖形學(xué)實驗2022/8/102序號實 驗 項 目1填充算法的實現(xiàn) 2正方體的比例、平移、旋轉(zhuǎn)變換及投影顯示 3用矩形窗口對多邊形的裁剪 4多點插值的埃米爾特曲線、貝齊爾曲線及B樣條曲線 54階3次等距B樣條曲線繪制及變換 6求解兩凸多邊形的交集 7顯示Julia集 8上機考試2022/8/103如何建立一個VC+應(yīng)用程序框架文件:2022/8/1042022/8/1052022/8/1062022/8/1072022/8/1082022/8/109編輯狀態(tài)下的窗口布局2022/8/1010調(diào)試狀態(tài)下的窗口布局2022/8/1011一.MFC繪圖函數(shù): 1.1 生成設(shè)備

2、環(huán)境對象 設(shè)備環(huán)境是一個對窗口的繪圖表面的屬性保持跟蹤的數(shù)據(jù)結(jié)構(gòu)。這些屬性包括用于在屏幕上繪圖的當(dāng)前所使用的畫筆和畫刷。設(shè)備環(huán)境每次只能用一種畫筆和一種畫刷。而設(shè)備環(huán)境對象就是設(shè)備環(huán)境類的一個實例,它設(shè)置了繪圖工具,并提供了繪制點、線等簡單圖形的繪圖函數(shù)。所有的繪圖工作都要通過設(shè)備環(huán)境對象來實現(xiàn)。2022/8/1012例如,如果想用一個能夠畫粗線條的畫筆,就必須創(chuàng)建一個新畫筆,然后用它取代設(shè)備環(huán)境中原有的畫筆。類似的,如果想用紅色的畫刷填充一個圖形,必須創(chuàng)建一個畫刷,并將它選進(jìn)設(shè)備環(huán)境,這就是Windows程序員在設(shè)備環(huán)境中取得工具的方式。2022/8/1013下面簡單介紹幾種設(shè)備環(huán)境:Gra

3、phical Drawing Classes2022/8/1014.CDC 設(shè)備環(huán)境對象類,是其它設(shè)備環(huán)境的基類。 一般情況下,應(yīng)用程序都要在View(視圖)類中來進(jìn)行繪圖,視圖窗口繪制或者重繪,應(yīng)用程序框架都要調(diào)用視圖類的OnDraw成員函數(shù)。void CMyDrawView:OnDraw(CDC* pDC)/ TODO: add draw code for native data here2022/8/1015.CPaintDC 構(gòu)造函數(shù)調(diào)用BeginPaint ,析構(gòu)函數(shù)調(diào)用EndPaint。 有時在視圖窗口以外的窗口(如對話框)中繪制圖形,需要調(diào)用窗口類的WM_PAINT的消息處理函數(shù)

4、 OnPaint來繪制或者重繪窗口,OnPaint函數(shù)必須生成由 CPaintDC類派生的設(shè)備環(huán)境對象,如下所示:void CMyDialog:OnPaint() CPaintDC dc(this);2022/8/1016CPaintDC dc(this);創(chuàng)建一個名為dc的設(shè)備環(huán)境對象,而this指向當(dāng)前的對話框。這樣就可以在對話框畫圖了。 注意:由于視圖類窗口也是窗口的一類,所以視圖窗口要繪制時,也收到WM_PAINT 的消息,但是當(dāng)CView的派生類沒有OnPaint函數(shù)消息處理函數(shù)時,將執(zhí)行CView提供的OnPaint函數(shù),生成和準(zhǔn)備設(shè)備環(huán)境對象,然后將對象傳入OnDraw函數(shù)。只有

5、不從視圖類派生的窗口類才需要提供自己的OnPaint函數(shù)做各種窗口繪圖工作。2022/8/1017void CView:OnPaint() CClientDC dc(this)if(輸出設(shè)備是屏幕)OnDraw(&dc);else/輸出設(shè)備是打印機OnPrint(&dc);2022/8/1018.CClientDC 這個設(shè)備環(huán)境對象僅僅代表了當(dāng)前窗口區(qū)域。它的構(gòu)造函數(shù)調(diào)用GetDC函數(shù),它的析構(gòu)函數(shù)調(diào)用ReleaseDC 函數(shù)。對于在OnDraw和OnPaint消息處理函數(shù)之外的函數(shù)中顯示圖形,必須生成CClientDC類成員的設(shè)備環(huán)境對象。2022/8/1019CMyWnd:Function

6、()CClientDC dc(this);/ CMyWnd必須是CWnd的子類(派生類)/ TODO: Add your message handler code here2022/8/1020CMyWnd:Function()CClientDC *pDC; pDC-GetDC();/ TODO: Add your message handler code herepDC-ReleaseDC();2022/8/1021#include math.hvoid CDDALineView:DDALine(CDC* pDC, int x1, int y1, int x2, int y2) double

7、 dx,dy,e,x,y;dx=x2-x1; dy=y2-y1;e=(fabs(dx)fabs(dy)? fabs(dx):fabs(dy); dx/=e; dy/=e;x=x1; y=y1;for(int i=1; iSetPixel(int)(x+0.5),(int)(y+0.5),RGB(0,0,0);x+=dx; y+=dy;2022/8/10221.2 選擇繪圖工具畫筆,畫刷,字體等都屬于圖形設(shè)備接口對象。(CGdiObject)系統(tǒng)默認(rèn)的畫筆和畫刷:默認(rèn)的畫筆畫出的線為寬度為1像素的黑色實線。默認(rèn)的畫刷是白色的,己用默認(rèn)的畫刷填充圖形時,圖形的內(nèi)部填充成白色。2022/8/1023

8、121 選用庫存的繪圖工具CDC:SelectStockObject(int nIndex);void CMyView:OnDraw(CDC*pDC)pDC-SelectStockObject(WHITE_PEN);pDC-SelectStockObject(GRAY_BRUSH);2022/8/1024122 生成自定義的繪圖工具 生成自定義畫筆和畫刷的基本步驟: (1)生成畫筆(CPen類)和畫刷(CBrush)類的實例; (2)調(diào)用CPen類和CBrush類的成員函數(shù)來初始化畫筆和畫刷; (3)將生成的畫筆和畫刷選入設(shè)備環(huán)境對象中,并將設(shè)備環(huán)境對象的原有的畫筆和畫刷保存在指針中; (4)

9、調(diào)用相應(yīng)的繪圖函數(shù)進(jìn)行繪圖; (5)將原來的畫筆和畫刷重新選入設(shè)備環(huán)境對象中 2022/8/1025 (1)生成筆(CPen類)和刷(CBrush)類的實例; CPen pen; CBrush brush; (2)調(diào)用CPen類和CBrush類的成員函數(shù)來初始化筆和刷; 畫筆的初始化 CPen:CreatePen 2022/8/1026 BOOL CreatePen(int nPenStyle, int nWidth,COLORREF crColor); nPenStyle : PS_SOLID PS_DOT PS_DASH PS_DASHDOT PS_DASHDOTDOT nWidth :

10、線的寬度(線寬1均產(chǎn)生實線)2022/8/1027 crColor參數(shù)指定線的顏色,類型為 COLORREF RGB(BYTE bRed , BYTE bGreen, BYTE bBlue); 0bRed ,bGreen, bBlue255 RGB宏功能定義了16種純顏色。 2022/8/1028RGB(0,0,0);黑色RGB(255,255,255);白色RGB(128,0,0);深紅RGB(255,0,0);紅色RGB(0, 128,0);深綠RGB(0, 255,0);綠色RGB(0,0,128);深藍(lán)RGB(0,0,255);藍(lán)色RGB(128,128,0);深黃RGB(255,25

11、5,0);黃色RGB(0,128,128);深青RGB(0,255,255);青色等。2022/8/10292022/8/1030畫刷的初始化:/創(chuàng)建實心畫刷 BOOL CreateSolidBrush( COLORREF crColor);/創(chuàng)建影線畫刷BOOL CreateHatchBrush( int nIndex,COLORREF crColor);/創(chuàng)建位圖畫刷BOOL CreatePatternBrush( CBitmap *pBitmap);2022/8/1031 nIndex指定格子的形式。 HS_CROSS 水平垂直交叉陰影 HS_HORIZONAL 水平陰影線 HS_VER

12、TICAL 豎直陰影線 HS_DIAGCROSS 45度交叉陰影對角線 HS_BDIAGONAL 以45度角從左上到右下傾斜的陰影 HS_FDIAGONAL 以45度角從左下到右上傾斜的陰影2022/8/10322022/8/1033(3)將生成的筆和刷選入設(shè)備環(huán)境對象中,并將設(shè)備環(huán)境對象的原有的筆和刷保存在指針中;CDC:SelectObjectCPen * SelectObject (CPen *pPen);CBrush*SelectObject(Cbrush*pBrush);注意:該函數(shù)返回的是原來的設(shè)備環(huán)境對象的指針2022/8/10341.3 設(shè)置繪圖屬性 (1) 背景色 GetBk

13、Color()返回當(dāng)前的背景色。 SetBkColor(COLORREF crColor)函數(shù)是將當(dāng)前的背景色設(shè)置成參數(shù)crColor所代表的顏色值。2022/8/1035(2)背景方式 GetBkMode() SetBkMode(int nBkMode) nBkMode: OPAQUE(不透明) TRANSPARENT(透明) 這兩個函數(shù)主要影響Chord ,Ellipse和Pie等閉合圖形繪圖函數(shù)。2022/8/1036(3)繪圖方式GetROP2( );int SetROP2( int nDrawMode );繪圖方式(nDrawMode) 組合后像素的顏色R2_BLACK 總為黑色R2

14、_WHITE 總為白色R2_NOT 顏色與屏幕顏色相反R2_COPYPEN 具有畫筆的顏色R2_NOTCOPYPEN 具有與畫筆相反的顏色2022/8/1037R2_XORPEN final pixel = pen XOR screen pixel.R2_NOTXORPEN final pixel = NOT(pen XOR screen pixel)2022/8/10380001110001110001110001110001110001110001110110010001110001112022/8/10391.4 幾種常用的繪圖函數(shù)1.畫線函數(shù) (1) 成員函數(shù)MoveTo:將當(dāng)前的繪圖

15、位置移到point 指定的坐標(biāo)處 CPoint MoveTo(int x,int y); CPoint MoveTo(POINT point); (2) 成員函數(shù)LineTo 在當(dāng)前的繪圖位置上與一個新坐標(biāo)點之間畫一條直線,這個新的坐標(biāo)點將變成當(dāng)前位置。 BOOL LineTo (int x,int y); BOOL LineTo (POINT point);2022/8/1040(3)成員函數(shù)Arc 畫一個橢圓形的弧線,它是一個指定邊界矩形內(nèi)一個內(nèi)切橢圓的一段。 BOOL Arc(int x1,int y1,int x2, int y2,int x3,int y3,int x4,int y4

16、);(4)成員函數(shù)PolylBezier BOOL PolyBezier( const POINT *lpPoints,int nCount); 繪制由幾個控制點所決定的多條Bezier曲線一般給定的點為所畫樣條函數(shù)的3倍加12022/8/10412.畫簡單的閉合圖形 (1) Rectangle BOOL Rectangle(int x1,int y1, int x2,int y2); (2) Ellipse BOOL Ellipse(int x1,int y1, int x2,int y2); 2022/8/1042 (3) Chord(一個橢圓和一條直線相交的圖形) BOOL Chord(

17、int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); (4)Polygon BOOL Polygon( LPPOINT lpPoints, int nCount ); LpPoints是一個指向CPoint實例的POINT數(shù)組的指針 其中 nCount22022/8/1043三.鼠標(biāo)消息函數(shù)的應(yīng)用:2022/8/10442022/8/1045void CMyLineView:OnLButtonDown (UINT nFlags, CPoint point) m_Oldpoint=point;/保存光標(biāo)的當(dāng)前位置m_Newpoint=

18、point;/存放畫線的起始位置SetCapture(); /捕捉鼠標(biāo)m_pLMouseDown=TRUE;/表示鼠標(biāo)為按下的狀態(tài)CRect rect;GetClientRect(&rect);/獲得并保存用戶區(qū)坐標(biāo) MyLine應(yīng)用程序(鼠標(biāo)消息的應(yīng)用)2022/8/1046ClientToScreen(&rect); /用用戶區(qū)坐標(biāo)重新計算屏幕坐標(biāo)ClipCursor(&rect); /限制光標(biāo)在用戶區(qū)內(nèi)/默認(rèn)處理,調(diào)用基類消息處理函數(shù)CView:OnLButtonDown(nFlags, point);2022/8/1047void CMyLineView:OnMouseMove (UINT nFlags, CPoint point) if(m_pLMouseDown)CClientDC dc(this); dc.SetROP2(R2_NOT); /設(shè)置繪圖模式,以屏幕顏色的相反色繪圖 2022/8/1048/以重繪的方式擦除前一個OnMouseMove繪制的直線 dc.MoveTo(m_Newpoint); dc.LineTo(m_Oldpoint); dc.MoveTo(m_Newpoint);

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論