圖形學實驗報告_第1頁
圖形學實驗報告_第2頁
圖形學實驗報告_第3頁
圖形學實驗報告_第4頁
圖形學實驗報告_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、課程設計報告實驗名稱:計算機圖形學實驗目錄TOC o 1-5 h z HYPERLINK l bookmark4 o Current Document 實驗目的與要求1實驗任務內(nèi)容與步驟1實驗一1實驗二3 HYPERLINK l bookmark20 o Current Document 實驗結(jié)果3實驗一結(jié)果3實驗二結(jié)果8 HYPERLINK l bookmark28 o Current Document 心得體會8源代碼9 1.1實驗目的與要求:目的:利用OpenGL庫,對課本的圖形原理進行C語言編程,從而實現(xiàn)各種繪圖算法。從中進一步了解計算機圖形學的原理,加深對課程內(nèi)容的理解,逐步掌握算法

2、原理的實現(xiàn)過程。另外,初步掌握OpenGL的基本使用方法,能夠使用其進行簡單圖形、圖素的繪制。實驗要求:I理解glut程序框架理解窗口到視區(qū)的變換理解OpenGL實現(xiàn)動畫的原理添加代碼實現(xiàn)中點Bresenham算法畫直線添加代碼實現(xiàn)改進Bresenham算法畫直線添加代碼實現(xiàn)圓的繪制(可以適當對框架坐標系進行修改II.理解OpenGL中的變換過程理解透視投影與平行投影的不同添加代碼實現(xiàn)太陽、地球和月亮的運動模型了解深度測試通過變換調(diào)整觀察的位置與方向加入光照模型1.2實驗一、利用各種算法實現(xiàn)直線與圓的掃描轉(zhuǎn)換,在對應圖中顯示的同時,還要在控制臺中打印顯示像素點的坐標,以及誤差d,e的值。中點B

3、resenham算法利用中點Bresenham算法畫出直線,其中直線的斜率要求為:0=k=1.具體參數(shù)如下:x0,y0起點坐標x1,y1終點坐標num掃描轉(zhuǎn)換時從起點開始輸出的點的數(shù)目算法實現(xiàn)流程步驟:對斜率k以及掃描點個數(shù)進行可行性判斷。2通過起始點和終點,確定最大位移方向。算出dO,以及dx,dy,由最大位移方向確定dx,dy在不同情況下的增量UpIncre,DownIncre。通過循環(huán)根據(jù)di逐步確定xi,yi,從而完成直線繪制。改進的Bresenham算法.利用改進的Bresenham算法畫出直線,其中直線的斜率要求為:0二k=l.具體參數(shù)如下:x0,y0起點坐標x1,y1終點坐標nu

4、m掃描轉(zhuǎn)換時從起點開始輸出的點的數(shù)目.算法實現(xiàn)流程步驟:對斜率k以及掃描點個數(shù)進行可行性判斷。通過起始點和終點,確定最大位移方向。算出dx,dy,由最大位移方向確定變化量e。通過循環(huán)根據(jù)逐步確定xi,yi,以及修改ei的值從而完成直線繪制。Bresenham算法畫圓利用圓對稱性八分法,以及Bresenham算法畫圓。具體參數(shù)如下:x,yRnum圓心坐標圓半徑掃描轉(zhuǎn)換時從起點開始輸出的點的數(shù)目.算法實現(xiàn)流程步驟:設置起點坐標,以及誤差dO初始值。導出d在不同情況下的遞推公式,以及x和y變化的范圍(在八分之一圓弧范圍內(nèi))。根據(jù)x,y的界限設置循環(huán):按照八分法在不同位置同步顯示像素點。:打印所顯示像

5、素點的坐標。:由遞推公式更新d以及x,y的值。實驗二、根據(jù)原子核轉(zhuǎn)動的模型,仔細研讀代碼,修改成:月球繞地球旋轉(zhuǎn),地球繞太陽旋轉(zhuǎn)的地月模型。同時要求,各個天體用不同的顏色相區(qū)分,通過代碼添加地球與月亮受太陽光照反射的光照效果。步驟:(1)初始化各種屬性,光源顏色,材質(zhì)屬性,深度測試,多邊形表示的方法以及背景顏色。(2)設置視區(qū)的大小尺寸,同時對空間進行修剪,確定觀察空間。(3)在函數(shù)模塊RenderScene中添加月亮繞地球旋轉(zhuǎn)的恢復矩陣;再添加一個類似于電子的屬性表,用以描述月亮;同時修改各個天體的顏色,用以區(qū)分。(4)調(diào)整各個天體的大小,同時對最大的天體太陽的顯示邊數(shù)進行修改,增加其邊數(shù)使

6、太陽邊界更為圓滑。(5)為月球繞地球的旋轉(zhuǎn)添加新的旋轉(zhuǎn)步長,使得月亮繞地球以及地球繞太陽旋轉(zhuǎn)的速度有所區(qū)分,模擬出地月運行的效果。(6)在initial初始化函數(shù)中添加設置光照的代碼,同時把光照效果中光源的坐標位置設置為與太陽坐標位置相同。(7)調(diào)試運行觀察運行的情況,著重檢查:天體間的運行是否具有相對獨立性;光照效果中,由于太陽本身是光源因此不應該存在光照效果1.3實驗結(jié)果實驗一、1)DDA畫線算法:圖1.1各像素點坐標:n軸畫線算法復各點坐標XXXXXXX1.8K00R0,9=目.7E8000,2.8K00fiti,y=l.S80000,3”y=2.2500,4.8K00fiti,y=3.

7、0tf0000,5.8K00fili,y=3.7E8000,6.8K00fili,y=4.S80000,x=,y=3x=l,y=lx=2,y=2x=3,y=2x=4,y=3x=S,y=4x=6,y=5XXXXX7.y=S,2500,4S.8K00BW,y=&-0tf0000,J;9.y=6.?E皆劇械事,耳10.000fiW0,iF=?.5B00R0,11.12.000fiW0,iF=?.8000fili,13.?E阿械戀0,14.000fiW0,iF=10.XxXX.00BtS0,iF=12.00S5ftS0,0B00,y=12.n00BtS0,iF=13.Ei8StftS0,0B00,y=

8、14.23.S00BW0,.000tftS0,圖1.22)中點Bresenham算法:掃描轉(zhuǎn)化情況:x=7,y=5x=8,=6x=9,y=7x=10J.y=8x=ll,y=8x=12,y=9x=13,y=10 xXXXXXXy=lly=lly=12y=13y=14y=142.y=lEi像素點機誤差d的值:圖1.43)改進的Bresenham算法:各點坐標及判別式的值圖1.6像素點坐標及誤差e:Bresenham算法畫直線x=0,y=0,e=-20 x=l,iF=l,e=-30 x=2,y=l,e=0 x=3,y=2,e=-lBx=4,y=3,e=-2ex=5,y=4,e=-30 x=6,y=4

9、,e=E*x=7,y=E,e=-lE?x=8,y=6,e=-20 x=9,y=7,e=-30 x=10,y=?,e=0 x=ll,y=8,e=-lE!x=12,y=9,e=-20 x=13,x=14y=10e=0 x=15,y=ll,e=-10 x=16,iF=12,e=-20 x=17,y=13,e=-30 x=18,y=13,e=0 x=19,y=14,e=-lSx=20,/=15,e=-20(3)Bresenham算法畫圓圓的掃描轉(zhuǎn)化:圖1.8圖1.9圖1.10圓的像素點坐標值及誤差d:h創(chuàng)算法畫圓:各點坐標斥判別式的值x=13,y=23,d=-9x=23,y=13,d=-9x=13,y

10、=23,d=-9x=23,y=13,d=-9x=13,y=H,d=-9x=23,y=13,d=-9x=13J.y=3,(1=-9x=23,y=13,d=-9x=14,i/=23,d=-6x=23,/=13,d=-9x=12,v=23,d=-6x=23,y=13,d=-9x=12,y=3,d=-6x=23,y=13,d=-9x=14,y=3,d=-6x=23,y=13,d=-9x=15J.i/=23,d=-lx=23,y=13,d=-9x=ll=23.d=-lx=23,y=13,d=-9x=ll,iF=3,d=-lx=23,/=13,d=-9x=15,/=3,d=-lx=23,y=13,d=-9

11、x=16,y=23,d=6x=23,y=13,d=-9x=10,y=23,d=6x=23,y=13,d=-9x=10J.i/=3,(1=6x=23,y=13,d=-9x=16J.y=3,(1=6x=23,y=13,d=-9x=17,iF=22,d=-3x=23,/=13,d=-9x=9,y=22,d=-3x=23,y=13,d=-9x=9,y=4,d=-3x=23,y=13,d=-9x=17,y=4,d=-3x=23,y=13,d=-9x=18,/=22,d=8x=23,y=13,d=-9x=8,y=22,d=8x=23,u=13,d=-9圖1.11XXXXXXXXXXXXXXXXXXXXXX

12、XXXXXXXXXXXXXXXXXXXXXX戟霰霰議議議霰霰議議霰議霰議議霰議霰KK議議霰霰議議議霰霰議議議霰霰議議霰議霰議議議議霰KmnFnFnrni帀mnFnFnrni帀帀市mn帀帀帀市mnFnrnn刃帀mnFnrn4-1.1可帀mnFnrn4-1.1帀mTmn刃7,Sf=5,d=523,y=13,d=-9y=5,d=523,y=13,d=-9y=20,d=623,y=13,d=-96J.y=20,d=623,y=13,d=-96,y=6,d=623,y=13,d=-920,=6,(1=623,y=13,d=-923,y=13,d=-93,p=13,d=-93,=13,d=-923,y=1

13、3,d=-923,y=14,d=-63,y=14,d=-63,p=12,d=-623,y=12,d=-623,y=15,d=-l3,sf=15,d=-l3,y=ll,d=-l23,y=ll,d=-l23,y=16,d=63J.y=16,d=6y=10.d=623,y=10,d=622,y=17,d=-3y=17,d=-34,sf=9,d=-322,y=9.d=-322,y=18,d=84,p=18,d=8p=8,d=822-y=8.d=8y=19,d=55,sf=19,d=5=7,d=521,y=7,d=520,y=20,d=66J.y=20,d=62B,y=6,d=6圖1.12實驗二、地月模

14、型結(jié)果圖2.1圖2.21.4心得體會:本次實驗,通過OpenGL的圖形庫實現(xiàn)了各種圖形的掃描算法。在把用數(shù)學和自然語言描述的算法轉(zhuǎn)化成C語言代碼從而付諸于程序?qū)崿F(xiàn)的過程中,也加深了對各個算法的理解。通過運行各個算法,尤其是直線掃描的各個算法的結(jié)果,可以看出各個算法的執(zhí)行結(jié)果并不一致,直線不滑行在不同的情況下也有所區(qū)別,這是僅僅通過學習算法原理所不能獲得的體會。而且程序運行的過程是一步步分解的過程,例如八分法畫圓的算法,就可以看出從圓弧生成真?zhèn)€圓形的全過程,是化抽象為具體的一個很好的例子。另一方面,在OpenGL圖形庫的幫助下,完成了很多復雜的圖形程序,如地月模型,也讓我認識的這個圖形庫功能的強

15、大。而在助教檢查驗收時,對我們提出的種種問題,有時候也沒法及時回答上來,這是自己對算法了解仍不夠透徹的體現(xiàn),希望以后多加努力??偠灾?,本次實驗通過化抽象為具體,使我能夠直觀地認識到圖形學中很多算法的執(zhí)行原理與效果,是對課程的一次很好的延伸與拓展。1.5源程序:實驗一、#include#include#includestdio.hintm_PointNumber=0;/動畫時繪制點的數(shù)目intm_DrawMode=1;/繪制模式1DDA算法畫直線/2中點Bresenham算法畫直線/3改進Bresenham算法畫直線/4八分法繪制圓/5四分法繪制橢圓voidDrawCordinateLine(

16、void)inti=0;/坐標線為黑色glColor3f(0.0f,0.0f,0.0f);glBegin(GL_LINES);for(i=10;iabs(dy)epsl=abs(dx);elseepsl=abs(dy);xIncre=(float)dx/epsl;yIncre=(float)dy/epsl;for(k=0;k=num-1)printf(x=%f,y=%f取整后x=%d,y=%dn,x,y,(int)(x+05),(int)(y+05);break;x+=xIncre;y+=yIncre;if(x=25|y=25)break;/TOC o 1-5 h z中點Bresenham算法

17、畫直線(0v=kv=1)II參數(shù)說明:x0,y0起點坐標IIIIx1,y1終點坐標IIIInum掃描轉(zhuǎn)換時從起點開始輸出的點的數(shù)目,用于動畫IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIvoidBresenhamLine(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum)glColor3f(1.0f,0.0f,0.0f);intk=0;if(num=1)printf(中點Bresenham算法畫直線:各點坐標及判別式的值n);elseif(num=0)

18、return;GLsizeidx,dy,d,UpIncre,DownIncre,x,y,xend;if(x0 x1)x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;while(xv=x1)putpixel(x,y);if(k=num-1)printf(取整后x=%d,y=%d,d=%dn,x,y,d);break;k+;x+;if(d=num-1)printf(取整后x=%d,y=%d,e=%dn,x,y,e);break;k+;put

19、pixel(x,y);x+;e=e+2*dy;if(e0)y+;e=e-2*dx;/Bresenham算法畫圓/參數(shù)說明:x,y圓心坐標/R圓半徑/num掃描轉(zhuǎn)換時從起點開始輸出的點的數(shù)目,用于動畫/voidBresenhamCircle(GLsizeix,GLsizeiy,GLsizeiR,GLsizeinum)glColor3f(1.0f,0.0f,0.0f);if(num=1)printf(Bresenham算法畫圓:各點坐標及判別式的值n);inti=1;GLsizeid,swap;x=0;y=R;d=1-R;intk=0;for(i=1;i=2;i+)x=0;y=R;d=1-R;wh

20、ile(x=num-1)printf(取整后x=%d,y=%d,d=%dn,13+x,13+y,d);break;k+;putpixel(13+x,13+y);if(k=num-1)printf(取整后x=%d,y=%d,d=%dn,13-x,13+y,d);break;k+;putpixel(13-x,13+y);if(k=num-1)prinf(取整后x=%d,y=%d,d=%dn,13-x,13-y,d);break;k+;putpixel(13-x,13-y);if(k=num-1)printf(取整后x=%d,y=%d,d=%dn,13+x,13-y,d);break;k+;putp

21、ixel(13+x,13-y);elseif(k=num-1)printf(取整后x=%d,y=%d,d=%dn,13+y,13+x,d);break;k+;putpixel(13+y,13+x);if(k=num-1)printf(取整后x=%d,y=%d,d=%dn,13-y,13+x,d);break;k+;putpixel(13-y,13+x);if(k=num-1)prinf(取整后x=%d,y=%d,d=%dn,13-y,13-x,d);break;k+;putpixel(13-y,13-x);if(k=num-1)printf(取整后x=%d,y=%d,d=%dn,13+y,13

22、-x,d);break;k+;putpixel(13+y,13-x);if(d0)d+=2*x+3;elsed+=2*(x-y)+5;y-;x+;/初始化窗口voidInitial(void)/設置窗口顏色為藍色glClearColor(1.0f,1.0f,1.0f,1.0f);/窗口大小改變時調(diào)用的登記函數(shù)voidChangeSize(GLsizeiw,GLsizeih)if(h=0)h=1;/設置視區(qū)尺寸glViewport(0,0,w,h);/重置坐標系統(tǒng)glMatrixMode(GL_PROJECTION);glLoadIdentity();/建立修剪空間的范圍if(w=h)glOrt

23、ho(0.0f,250.0f,0.0f,250.0f*h/w,1.0,-1.0);elseglOrtho(0.0f,250.0f*w/h,0.0f,250.0f,1.0,-1.0);/在窗口中繪制圖形voidReDraw(void)/用當前背景色填充窗口glClear(GL_COLOR_BUFFER_BIT);/畫出坐標線DrawCordinateLine();switch(m_DrawMode)case1:DDACreateLine(0,0,20,15,m_PointNumber);break;case2:BresenhamLine(0,0,20,15,m_PointNumber);brea

24、k;case3:Bresenham2Line(0,0,20,15,m_PointNumber);break;case4:BresenhamCircle(0,0,10,m_PointNumber);break;default:break;glFlush();/設置時間回調(diào)函數(shù)voidTimerFunc(intvalue)if(m_PointNumber=0)value=1;m_PointNumber=value;glutPostRedisplay();glutTimerFunc(500,TimerFunc,value+1);/設置鍵盤回調(diào)函數(shù)voidKeyboard(unsignedcharke

25、y,intx,inty)if(key=1)m_DrawMode=1;if(key=2)m_DrawMode=2;if(key=3)m_DrawMode=3;if(key=4)m_DrawMode=4;m_PointNumber=0;glutPostRedisplay();/voidmain(void)intmain(intargc,char*argv)glutInit(&argc,argv);初始化GLUT庫OpenGL窗口的顯示模式glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(600,600);glutInitWin

26、dowPosition(100,100);glutCreateWindow(基本圖元繪制程序);glutDisplayFunc(ReDraw);glutReshapeFunc(ChangeSize);glutKeyboardFunc(Keyboard);/鍵盤響應回調(diào)函數(shù)glutTimerFunc(500,TimerFunc,1);/窗口初始化Initial();glutMainLoop();/啟動主GLUT事件處理循環(huán)return0;實驗二、#include#include#include#includevoidInitial()/太陽白色光源GLfloatmat_ambient=0.2f,

27、0.2f,0.2f,0.1f;GLfloatmat_diffuse=0.9f,0.9f,0.9f,1.0f;GLfloatmat_specular=1.0f,1.0f,1.0f,1.0f;GLfloatmat_shininess=25.0f;GLfloatmat_emission=0.0f,0.0f,0.0f,1.0f;GLfloatlight0_diffuse=1.0f,1.0f,1.0f,1.0f;GLfloatlight0_position=0.0f,30.0f,-250.0f,1.0f;/GLfloatlight1_ambient=0.2f,0.2f,0.2f,1.0f;/GLfloa

28、tlight1_diffuse=0.2f,0.2f,0.2f,1.0f;/GLfloatlight1_position=0.0f,0.0f,250.0f,0.0f;GLfloatspot_direction=1.0f,1.0f,-1.0f;/定義材質(zhì)屬性glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);glLightfv(GL_LIGHT0,GL_DIFFUSE,light0_diffuse);glLightfv(GL_LIGHT0,GL_POSITION,light0_position);/glLightfv(GL_LIGHT1,GL_DIFFUSE,light1_diffuse);/g

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論