版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、計算機圖形學(xué)實驗報告實驗九 二維圖形變換一、實驗教學(xué)目標與基本要求1.掌握圖形變換的基本算法原理;2.實現(xiàn)若干典型二維圖形變換算法。二理論基礎(chǔ)1.生成前幾次實驗中的基本圖形;2.對生成的基本圖形進行平移、旋轉(zhuǎn)、放縮、對稱等變換。3. 對計算機繪圖的原理有一定的認識。三算法設(shè)計與分析1二維變換1. 平移變換2.比例變換 sx sy 1 等比例變換 sx sy 1 放大 sx sy 1 縮小 sx sy 13.對稱變換當(dāng)b=d=0, a=-1, e=1時關(guān)于y軸對稱當(dāng)b=d=0, a=1, e=-1時關(guān)于x軸對稱當(dāng)b=d=0, a=-1, e=-1時關(guān)于原點對稱當(dāng)b=d=1, a=e=0時關(guān)于直線
2、y=x對稱當(dāng)b=d=-1, a=e=0時關(guān)于直線y=-x對稱4.旋轉(zhuǎn)變換繞原點逆時針旋轉(zhuǎn)5.錯切變換 當(dāng)d=0時,x*=x+by,y*=y,沿x方向錯切位移 當(dāng)b=0時,x*=x,y*=dx+y, 沿y方向錯切位移 當(dāng)b0時,當(dāng)d0時,x*=x+by,y=dx+y 6.復(fù)合變換-復(fù)合平移 對同一圖形做兩次平移相當(dāng)于將兩次的平移兩加起來:復(fù)合變換-復(fù)合縮放 復(fù)合變換-復(fù)合旋轉(zhuǎn)復(fù)合變換-關(guān)于f (xf,yf)點的縮放變換先把坐標系平移到(xf,yf),在新的坐標系下做比例變換,然后再將坐標原點平移回去。復(fù)合變換-繞f(xf,yf)點的旋轉(zhuǎn)變換先把坐標系平移到f(xf,yf),在新的坐標系下做旋轉(zhuǎn)變
3、換,然后再將坐標原點平移回去四、程序調(diào)試及結(jié)果的分析本程序運行環(huán)境為vc下的mfc環(huán)境。實驗代碼:void czuobiaobianhuanview:oncgpingyi() /平移/ todo: add your command handler code herefor(int i=0;i<3;i+) pti.x+=5; / pti.y+=5;redrawwindow();void czuobiaobianhuanview:oncgxuanzhuan() /旋轉(zhuǎn)變換float dangle=15.0*pi/180.0;for(int i=0;i<3;i+)pti.x=(pti.x
4、-500)*cos(dangle)-(pti.y-240)*sin(dangle)+500;pti.y=(pti.x-500)*sin(dangle)+(pti.y-240)*cos(dangle)+240;/ todo: add your command handler code hereredrawwindow();void czuobiaobianhuanview:oncgduicheng() /對稱變換/ todo: add your command handler code herefor(int i=0;i<3;i+)pti.x=2*500-pti.x;pti.y=pti.y
5、;redrawwindow();void czuobiaobianhuanview:oncgshuofang() /縮放變換/ todo: add your command handler code herefloat dscalex=1.1;float dscaley=1.1;for(int i=0;i<3;i+)pti.x*=dscalex;pti.y*=dscaley;redrawwindow();void czuobiaobianhuanview:oncgcuoqiebianhuan() /錯切變換/ todo: add your command handler code her
6、eint b=0,d=2;for(int i=0;i<3;i+)pti.x=pti.x-500+b*(pti.y-240)+500;pti.y=pti.y-240+d*(pti.x-500)+240;redrawwindow();void czuobiaobianhuanview:oncgjianpan() / todo: add your command handler code here/onkeydown(nchar,nrepcnt,nflags);void czuobiaobianhuanview:onkeydown(uint nchar, uint nrepcnt, uint
7、nflags) / todo: add your message handler code here and/or call defaultint i=0;cpoint temp=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;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 0x5a:
8、for(i=0;i<3;i+)pti.x=(pti.x-500)*0.8+500;pti.y=(pti.y-240)*0.8+240;break;case 0x58:for(i=0;i<3;i+)pti.x=(pti.x-500)*1.1+500;pti.y=(pti.y-240)*1.1+240;break;case 0x52:float dangle=15.0*pi/180.0;for(int i=0;i<3;i+)pti.x=(pti.x-500)*cos(dangle)-(pti.y-240)*sin(dangle)+500;pti.y=(pti.x-500)*sin
9、(dangle)+(pti.y-240)*cos(dangle)+240;break;redrawwindow();cview:onkeydown(nchar,nrepcnt,nflags);void czuobiaobianhuanview:ondraw(cdc* pdc)czuobiaobianhuandoc* pdoc = getdocument();assert_valid(pdoc);/ todo: add draw code for native data herecpen penred(ps_solid,3,rgb(255,0,0);/定義紅色筆 pdc->selectob
10、ject(&penred);pdc->moveto(pt0);pdc->lineto(pt1);pdc->lineto(pt2);pdc->lineto(pt0); pdc->moveto(100,240); pdc->lineto(900,240); pdc->moveto(500,5); pdc->lineto(500,400); /yuandian(500,240) pdc->textout(15,10,"平移變換,鍵盤方向鍵"); pdc->textout(15,28,"縮放變換,z縮小,
11、x放大"); pdc->textout(15,46,"旋轉(zhuǎn)變換,鍵盤r鍵"); pdc->textout(15,66,"還可以根據(jù)上面的菜單欄中的圖形變換進行選擇"); /onkeydown(nchar,nrepcnt,nflags);運行結(jié)果展示:原圖:旋轉(zhuǎn)變換后:對稱變換后:錯切變換后:實驗十 三維圖形變換一、實驗教學(xué)目標與基本要求1實習(xí)三維圖形的坐標系之間的變換;2三維圖形幾何變換;3掌握三維圖形的坐標系之間的變換算法及三維圖形幾何變換的原理和實現(xiàn)。二理論基礎(chǔ)實現(xiàn)三維圖形的坐標系之間的變換(世界坐標、物坐標、屏幕坐標)以及三維
12、圖形幾何變換。三算法設(shè)計與分析三維變換變換矩陣比例、錯切、旋轉(zhuǎn)變換1.平移變換 若點(x*, y*, z*)是由點(x,y,z)在x,y和z軸方向分別移動距離tx, ty和tz得到的,則這兩點間的坐標關(guān)系為: x* = x + tx y* = y + ty z* = z + tz 該式的矩陣形式為:2.比例變換設(shè)點(x,y,z)經(jīng)過縮放變換后得到點(x*,y*,z*),這兩點坐標間的關(guān)系為: x* = sx x ; y* = sy y ; z* = sz z ; 其中,sx,sy,sz 分別為沿x軸,y軸和z軸方向放大或縮小的比例。它們可以相當(dāng),也可以不相等。上式的矩陣形式如下所示:3. 旋轉(zhuǎn)
13、變換在右手坐標系下,設(shè)給定點的坐標為(x,y,z) = (rcos,rsin,z),則它繞z軸旋轉(zhuǎn)角后,得點(x,y,z),則 x = rcos(+) = xcos ysin ; y = rsin(+) = xsin+ ycos ; z = z ; 所以,旋轉(zhuǎn)變換對應(yīng)的變換矩陣為:4.對稱變換n 相對于xy平面對稱:坐標變換后有 x = x, y = y, z = -z; 則變換矩陣為:參數(shù)圖形的幾何變換n 對于一般的線框圖,可以利用基于點的幾何變換(前面所講),但對于參數(shù)表示的點、曲線、曲面圖形,通過基于點的幾何變換進行變換,則計算的工作量和存儲空間都會非常大,所以一般對其方程式直接進行參數(shù)
14、變換(基于數(shù)學(xué)運算)。n 其變換依然是通過變換矩陣進行變換。2.參數(shù)曲線、曲面的幾何變換(3) 比例變換比例系數(shù)為s,對參數(shù)曲線作變比例變換,只要對其幾何系數(shù)矩陣b作變比例變換就可以了。結(jié)果:b*= sb(4) 對稱反射變換 b*=brf四、程序調(diào)試及結(jié)果的分析實驗代碼:bool cshiwutuxingview:setwindowpixelformat(hdc hdc)/定義窗口的像素格式 pixelformatdescriptor pixeldesc= sizeof(pixelformatdescriptor),1,pfd_draw_to_window|pfd_support_opengl
15、|pfd_doublebuffer|pfd_support_gdi,pfd_type_rgba,24,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,pfd_main_plane,0,0,0,0 ; this->m_glpixelindex = choosepixelformat(hdc,&pixeldesc); if(this->m_glpixelindex=0) this->m_glpixelindex = 1; if(describepixelformat(hdc,this->m_glpixelindex,sizeof(pixelform
16、atdescriptor),&pixeldesc)=0) return false; if(setpixelformat(hdc,this->m_glpixelindex,&pixeldesc)=false) return false; return true;bool cshiwutuxingview:createviewglcontext(hdc hdc) this->m_hglcontext = wglcreatecontext(hdc); if(this->m_hglcontext=null) /創(chuàng)建失敗 return false; if(wglmak
17、ecurrent(hdc,this->m_hglcontext)=false) /選為當(dāng)前rc失敗 return false; return true; void cshiwutuxingview:ondestroy() cview:ondestroy();cview:ondestroy(); / todo: add your message handler code here if(wglgetcurrentcontext()!=null) wglmakecurrent(null,null); if(this->m_hglcontext!=null) wgldeleteconte
18、xt(this->m_hglcontext); this->m_hglcontext = null; / todo: add your message handler code hereint cshiwutuxingview:oncreate(lpcreatestruct lpcreatestruct) if (cview:oncreate(lpcreatestruct) = -1) return -1; / todo: add your specialized creation code here hwnd hwnd = this->getsafehwnd(); hdc
19、hdc = :getdc(hwnd); if(this->setwindowpixelformat(hdc)=false) return 0; if(this->createviewglcontext(hdc)=false) return 0; return 0;/ todo: add your specialized creation code herereturn 0;void cshiwutuxingview:onpaint() /cpaintdc dc(this); / device context for painting/ todo: add your message
20、handler code here/ do not call cview:onpaint() for painting messagescpaintdc dc(this); / device context for painting / todo: add your message handler code here / do not call cview:onpaint() for painting messages glloadidentity(); glclear(gl_color_buffer_bit); glbegin(gl_polygon);glcolor4f(1.0f,0.0f,
21、0.0f,1.0f);/glvertex2f(100.0f,50.0f);glvertex2f(pt0.x,pt0.y);glcolor4f(0.0f,1.0f,0.0f,1.0f);/glvertex2f(450.0f,400.0f);glvertex2f(pt1.x,pt1.y);glcolor4f(0.0f,0.0f,1.0f,1.0f);/glvertex2f(450.0f,50.0f);glvertex2f(pt2.x,pt2.y); glend();/auxwirebox(100,100,100); glflush();void cshiwutuxingview:onsize(ui
22、nt ntype, int cx, int cy) /cview:onsize(ntype, cx, cy);/ todo: add your message handler code herecview:onsize(ntype, cx, cy); / todo: add your message handler code here glsizei width,height; gldouble aspect; width = cx; height = cy; if(cy=0) aspect = (gldouble)width; else aspect = (gldouble)width/(g
23、ldouble)height; glviewport(0,0,width,height); glmatrixmode(gl_projection); glloadidentity(); gluortho2d(0.0,500.0*aspect,0.0,500.0); glmatrixmode(gl_modelview); glloadidentity();void cshiwutuxingview:onkeydown(uint nchar, uint nrepcnt, uint nflags) / todo: add your message handler code here and/or c
24、all defaultcview:onkeydown(nchar, nrepcnt, nflags);int i;/glloadidentity();switch(nchar) case vk_up:/*for(i=0;i<3;i+) pti.y+=5;*/glloadidentity ();gltranslatef (0.0, -5.0, 0.0);draw_triangle();break;case vk_down:/*for(i=0;i<3;i+)pti.y-=5;*/gltranslatef (0.0, 5.0, 0.0);draw_triangle();break;case vk_left:/*for(i=0;i<3;i+)
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- WPS 辦公應(yīng)用-教學(xué)大綱、授課計劃
- 2024年汽車熱交換器項目資金申請報告代可行性研究報告
- 有關(guān)追夢演講稿(17篇)
- 文明禮儀伴我行演講稿400(34篇)
- 學(xué)校表彰大會校長致辭
- 河西走廊觀后感600字范文(6篇)
- 珍惜糧食學(xué)生個人倡議書
- 理療師勞務(wù)合同范本
- 疫情期間幼兒工作總結(jié)5篇
- 新教材高考地理二輪專題復(fù)習(xí)單元綜合提升練3地球上的水含答案
- 安全總監(jiān)安全職責(zé)
- 云南白族課件
- 消防應(yīng)急預(yù)案組織結(jié)構(gòu)圖
- 油站使用說明書
- 小學(xué)班主任工作經(jīng)驗交流ppt
- 如何識別真假幣(共34張PPT)
- 2023屆高考數(shù)學(xué)復(fù)習(xí)微難點7 三角函數(shù)中ω的范圍問題(共11張PPT)
- 計算機科學(xué)與技術(shù)本科專業(yè)自評報告(共64頁)
- 工程建設(shè)情況匯報PPT課件
- GB∕T 39116-2020 智能制造能力成熟度模型
- 數(shù)學(xué)-九宮數(shù)獨100題(附答案)
評論
0/150
提交評論