計算機圖形學 圖形變換_第1頁
計算機圖形學 圖形變換_第2頁
計算機圖形學 圖形變換_第3頁
計算機圖形學 圖形變換_第4頁
計算機圖形學 圖形變換_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗五:圖形變換一、實驗?zāi)康模?、掌握圖形變換的基本方法。2、初步掌握映射菜單消息和捕獲鍵盤消息的方法。二、實驗內(nèi)容及要求:1、 以三角形為例,使用Visual C實現(xiàn)二維圖形的平移、旋轉(zhuǎn)和縮放功能。2、 每人單獨完成實驗。3、 按要求撰寫實驗報告,寫出實驗心得,并在實驗報告中附上程序的核心算法代碼。三、實驗設(shè)備:微機,Visual C+6.0四、實驗內(nèi)容和步驟:1、 打開VC,新建一個MFC Appwizard項目,選擇創(chuàng)建單文檔工程(SDI工程)。假設(shè)工程名為Transform。如圖1和圖2所示。圖1圖22、 在圖2的界面上點擊Finish,完成工程的創(chuàng)建。3、 在TransformVie

2、w.h文件中,加入如下代碼:public:CPoint Pt3;/存儲三角形的三個頂點float dAngle;/存儲三角形旋轉(zhuǎn)的角度4、 在類CTransformView的構(gòu)造函數(shù)中定義三角形的三個頂點的初始坐標和dAngle的初值,代碼如下;CTransformView:CTransformView()/ TODO: add construction code herePt0.x = 200; Pt0.y = 220;Pt1.x = 260; Pt1.y = 300;Pt2.x = 360; Pt2.y = 180;dAngle = 0.0;5、 在類CTransformView中添加成員

3、函數(shù)void DrawTriangle(CDC *pDC),并實現(xiàn)該函數(shù)。(該部分代碼請同學們自己實現(xiàn),為了簡便編程,可以使用MoveTo和LineTo函數(shù),也可以調(diào)用自己在實驗2中編寫的DDA或者Bresenham畫線函數(shù));6、 在類CTransformView的OnDraw()函數(shù)中添加繪制三角形的代碼;void CTransformView:OnDraw(CDC* pDC)CTransformDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereDrawTriangl

4、e(pDC);7、 映射菜單消息,方法是打開ResourceView菜單,依次展開MENU IDR_MAINFRAME,添加“圖形變換”主菜單項,在其下添加“平移”,如圖3所示。圖38、 在TransformView.cpp文件中(類CTransformView中)映射平移的菜單消息,觸發(fā)平移函數(shù)。代碼如下:void CTransformView:OnMenuTransformTranslate() / TODO: Add your command handler code hereint nX = 50; int nY = 80; /平移的X坐標和Y坐標for(int i=0; i<3

5、; i+)Pti.x += nX;Pti.y += nY;RedrawWindow();/該行代碼必不可少,用于觸發(fā)OnDraw()函數(shù)9、 與平移類似,請同學們自己依次添加“縮放”和“旋轉(zhuǎn)”菜單,并實現(xiàn)相應(yīng)的“縮放”菜單和“旋轉(zhuǎn)”菜單的消息映射函數(shù)。10、 添加捕獲鍵盤的消息,實現(xiàn)用鍵盤控制三角形的平移、縮放和旋轉(zhuǎn)。在TransformView.cpp文件中單擊鼠標右鍵,選擇ClassWizard,如圖4所示,為鍵盤消息WM_KEYDOWN添加消息映射函數(shù),代碼如下:void CTransformView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nF

6、lags) / TODO: Add your message handler code here and/or call defaultint i=0;CPoint TmpPt = Pt0;switch (nChar)case VK_UP:/用上箭頭控制三角形向上移動for(i=0; i<3; i+)Pti.y -= 5;break;case VK_DOWN:/用下箭頭控制三角形向下移動for(i=0; i<3; i+)Pti.y += 5;break;。/ RedrawWindow();CView:OnKeyDown(nChar, nRepCnt, nFlags);圖411、 請

7、同學們在WM_KEYDOWN的消息映射函數(shù)中,再自己實現(xiàn)用左、右箭頭控制三角形移動的代碼。左右箭頭的虛鍵分別為VK_LEFT, VK_RIGHT。12、 請同學們在WM_KEYDOWN的消息映射函數(shù)中,再自己實現(xiàn)用Z和X鍵控制三角形放大1倍和縮小1倍的代碼。在消息映射函數(shù)中,按下Z鍵,說明nChar=Z的ASCII碼;其他字母相同。13、 請同學們在WM_KEYDOWN的消息映射函數(shù)中,再自己實現(xiàn)用R鍵控制三角形旋轉(zhuǎn)的代碼。多按幾下R鍵,看看會發(fā)生什么情況?為什么會這樣?如何解決?五、核心代碼:這里將自己編寫的上機程序中的主要代碼拷貝粘貼過來;Ondraw:void CShiyqan5View

8、:OnDraw(CDC* pDC)CShiyqan5Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);DrawTriangle(pDC);用DDA畫出三角形void CShiyqan5View:DrawTriangle(CDC *pDC) DDALine(Pt0.x,Pt0.y,Pt1.x,Pt1.y,RGB(0,147,145); DDALine(Pt1.x,Pt1.y,Pt2.x,Pt2.y,RGB(0,147,145); DDALine(Pt2.x,Pt2.y,Pt0.x,Pt0.y,RGB(0,147,145);void CShiyqan5Vie

9、w:DDALine(int x0, int y0, int x1, int y1, COLORREF color)CDC *pDC = this->GetDC();int i;float dx, dy, length,x,y;if (fabs(x1-x0)>=fabs(y1-y0)length=fabs(x1-x0);elselength=fabs(y1-y0);dx= (x1-x0)/length;dy=(y1-y0)/length;i=1;x= x0;y= y0;while(i<=length)pDC->SetPixel(int (x + 0.5), int (y

10、+ 0.5), color);x=x+dx;y=y+dy;i+;實現(xiàn)圖形平移void CShiyqan5View:OnMenuTransformTranslate() / TODO: Add your command handler code hereint nX = 50; int nY = 80; /平移的X坐標和Y坐標for(int i=0; i<3; i+)Pti.x += nX;Pti.y += nY;RedrawWindow();縮放void CShiyqan5View:Onsuofang() int nX=200;int nY=200; for(int i=0 ;i<

11、3;i+)Pti.x=Pti.x*0.5;Pti.y=Pti.y*0.5;Pti.x+=nX;Pti.y+=nY;RedrawWindow();旋轉(zhuǎn)void CShiyqan5View:Onxuanzhuan() double dAngle=0.1;for(int i=0;i<3;i+)Pti.x=Pti.x*cos(dAngle)-Pti.y*sin(dAngle);Pti.y=Pti.x*sin(dAngle)+Pti.y*cos(dAngle);/ TODO: Add your command handler code hereRedrawWindow();鍵盤void CShiy

12、qan5View:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultint i=0;int nX=200;int nY=200;CPoint TmpPt = Pt0;switch (nChar)case VK_UP:/用上箭頭控制三角形向上移動for(i=0; i<3; i+)Pti.y -= 5;break;case VK_DOWN:/用下箭頭控制三角形向下移動for(i=0; i<3; i+)Pti.y +=

13、 5;break;case VK_LEFT:/用上箭頭控制三角形向左移動for(i=0; i<3; i+)Pti.x -= 5;break;case VK_RIGHT:/用下箭頭控制三角形向右移動for(i=0; i<3; i+)Pti.x += 5;break;case 90: /Z縮小 for(i=0 ;i<3;i+) Pti.x=Pti.x*0.5; Pti.y=Pti.y*0.5; Pti.x+=nX; Pti.y+=nY; break; case 88:/x放大 for(i=0 ;i<3;i+) Pti.x=Pti.x*2.0; Pti.y=Pti.y*2.0

14、; Pti.x+=nX; Pti.y+=nY; break;case 82:/R的旋轉(zhuǎn)double circular=15*3.1415/180; double x1=(Pt0.x)*cos(circular)-(Pt0.y)*sin(circular);double y1=(Pt0.x)*sin(circular)+(Pt0.y)*cos(circular);double x2=(Pt1.x)*cos(circular)-(Pt1.y)*sin(circular);double y2=(Pt1.x)*sin(circular)+(Pt1.y)*cos(circular);double x3=

15、(Pt2.x)*cos(circular)-(Pt2.y)*sin(circular);double y3=(Pt2.x)*sin(circular)+(Pt2.y)*cos(circular);/進行逆時針旋轉(zhuǎn)變化double sX=Pt0.x-x1;double sY=Pt0.y-y1;x1+=sX;y1+=sY;x2+=sX;y2+=sY;x3+=sX;y3+=sY;Pt0.x=x1;Pt0.y=y1;Pt1.x=x2;Pt1.y=y2;Pt2.x=x3;Pt2.y=y3;break;RedrawWindow();CView:OnKeyDown(nChar, nRepCnt, nFlag

16、s););六、屏幕顯示結(jié)果:這里將繪出的圖形界面拷貝下來;畫出三角形:縮小一半:旋轉(zhuǎn)實現(xiàn)向上移動:實現(xiàn)向下移動:向左鍵盤向右實現(xiàn)Z的縮放實現(xiàn)X的放大實現(xiàn)R的旋轉(zhuǎn)七、思考題(盡量做,計入成績):1、將三角形A(250,200),B(100,100),C(300,200)繞P(200,100)點旋轉(zhuǎn)45°,求旋轉(zhuǎn)后的三角形的坐標。要求畫出原三角形、坐標系、點P,旋轉(zhuǎn)后得到的新三角形。要求上機完成2、如何較好地繪出一個平面直角坐標系?(1)Scale法 通過自定義左上角和右下角坐標來設(shè)置新的坐標系統(tǒng)。用戶通過自定義坐標時,一般先選定ScaleMode=0,然后設(shè)定用戶自定義坐標ScaleM

17、ode=3,最后用Scale方法定義坐標系。(2)通過對象屬性ScaleLeft和ScaleTop直接賦值自定義坐標系3、在Turbo C中如果要編寫菜單的實現(xiàn)程序,是什么步驟?首先建立類向?qū)В缓笤赑roject的Cshiyan5View下的,Message是command下建立一個新的成員函數(shù)。然后設(shè)好ID,并且名字可以改成想要的。建好后就可以在函數(shù)體中添加代碼,來實現(xiàn)菜單。例如:void CShiyqan5View:OnMenuTransformTranslate() / TODO: Add your command handler code hereint nX = 50; int n

18、Y = 80; /平移的X坐標和Y坐標for(int i=0; i<3; i+)Pti.x += nX;Pti.y += nY;RedrawWindow();4、如果OnKeyDown函數(shù)中不加RedrawWindow()語句,會出現(xiàn)什么結(jié)果?為什么?RedrawWindow()是用來觸發(fā)Ondraw函數(shù)的,如果不用則無法進行調(diào)用。5、為什么旋轉(zhuǎn)程序的結(jié)果和預(yù)計的不一樣?因為P點是左上角的一個點,隨著三角形的旋轉(zhuǎn),圍繞著的中心點不斷向外延伸出去。這樣就和預(yù)想的結(jié)果有些不同了。八、實驗體會通過這次試驗,我學到了圖形變換的基本方法,同時初步掌握映射菜單消息和捕獲鍵盤消息的方法。根據(jù)實驗指導(dǎo)書的要求,以三角形為例,使用Visual C實現(xiàn)二維圖形的平移、旋轉(zhuǎn)和縮放功能。在映射平移的菜單消息中,觸發(fā)平移函數(shù)。使用RedrawWindow();這條語句,該行代碼必不可少,用于觸發(fā)OnDraw()函數(shù)。然后在實現(xiàn)縮放和平移的內(nèi)容。在做實驗時我一直編譯不通過,經(jīng)過老師的提點之后,發(fā)現(xiàn)我一開始是在Frame下建立類向?qū)?,而實際是應(yīng)該在View下建立,但是我只是把相應(yīng)的代碼從程序中刪除了,而沒有實際把他們刪掉,使得程序總是編譯不

溫馨提示

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

評論

0/150

提交評論