




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)報(bào)告班級(jí):軟工0801班學(xué)號(hào):U18013姓名:嚴(yán)森指導(dǎo)教師:萬(wàn)琳完畢曰期:-11-3華中科技大學(xué)軟件學(xué)院試驗(yàn)一:基本圖元繪制試驗(yàn)?zāi)康睦斫釵penGL圖形軟件包繪制圖形的基本過(guò)程及其程序框架,并在已經(jīng)有的程序框架中添加代碼實(shí)現(xiàn)直線和圓的生成算法,演示直線和圓的生成過(guò)程,從而加深對(duì)直線和圓等基本圖形生成算法的理解。二、試驗(yàn)內(nèi)容試驗(yàn)操作和環(huán)節(jié):本次試驗(yàn)重要的目的是為了掌握基本畫線和畫圓算法,對(duì)于書上給出的代碼,規(guī)定通過(guò)本次試驗(yàn)來(lái)詳細(xì)的實(shí)現(xiàn)。由于試驗(yàn)已經(jīng)給出大體的框架,因此只需要按照書上的算法思想來(lái)設(shè)計(jì)詳細(xì)實(shí)現(xiàn)代碼,對(duì)于直線DDA算法,中點(diǎn)Bresenham算法及其改善算法,以及Bresenham畫圓算法均有深入的體會(huì)。DDA算法是對(duì)每一步都要進(jìn)行增量處理,然後取整,繪制,而B(niǎo)resenham通過(guò)判斷誤差函數(shù)和求取遞推公式來(lái)實(shí)現(xiàn)。尤其是對(duì)于整數(shù)的選擇取舍,以及代碼的流程和循環(huán)的控制有一種深入的理解。同步也純熟運(yùn)用OpenGL基本的繪圖函數(shù)。三、試驗(yàn)成果1-1. DDA算法畫直線。
圖1-1-1,顯示每次DDA算法畫線的坐標(biāo)成果(如上)。圖1-1-2.顯示DDA算法畫圓過(guò)程及截圖1-2. 中點(diǎn)Bresenham算法畫直線1-2-1運(yùn)用中點(diǎn)Bresenham算法畫直線的各點(diǎn)坐標(biāo)如上:1-2-2.中點(diǎn)Bresenham畫線算法畫線過(guò)程截圖1-3. 運(yùn)用改善的Bresenham畫線算法來(lái)畫圖1-3-1.運(yùn)用改善的Bresenham算法來(lái)畫圖各點(diǎn)坐標(biāo)如上:1-3-2.運(yùn)用改善的Bresenham算法畫直線圖形如上1-4.運(yùn)用Bresenham畫圓算法來(lái)作圖1-4-1.運(yùn)用Bresenham畫圓法作圖各點(diǎn)坐標(biāo)如上:1-4-2.運(yùn)用Bresenham畫圓法作圖及截圖如上。四、體會(huì)通過(guò)本次試驗(yàn),我深入加深了對(duì)于基本畫圖算法的理解。尤其是對(duì)于DDA,Bresenham和畫圓算法。其中,DDA算法由于每一步都要處理浮點(diǎn)數(shù)的四舍五入,因此在繪圖時(shí)要進(jìn)行取整,效率較低,不過(guò)代碼直觀好懂,符合原理。而對(duì)于Bresenham及其改善算法,都是在理論推導(dǎo)的基礎(chǔ)上來(lái)實(shí)現(xiàn)的,然後通過(guò)整數(shù)化,形成了一種高效率的畫圖算法,因此需要合適的理解,尤其是對(duì)于取整操作判斷比較巧妙,實(shí)現(xiàn)了防止多次判斷計(jì)算浮點(diǎn)數(shù)的目的,因此比較高效。而繪制圓形的時(shí)候,用到的基本思想還是和Bresenham畫圖算法同樣,只不過(guò)需要注意的是八分法畫圓,這樣只需要繪制其中的八分之一就可以運(yùn)用對(duì)稱的關(guān)系來(lái)繪制出整個(gè)
圖形。而對(duì)于與否走下一步,或者是停留,判斷的根據(jù)還是誤差函數(shù),和前面的思想是類似。此外,通過(guò)試驗(yàn)訓(xùn)練了自已的編程能力,同步熟悉了OpenGL繪圖的函數(shù)和流程,也深入鞏固了有關(guān)的知識(shí)。五、源程序源代碼如下://////////////////////////////////////////////////////////////////////////////試驗(yàn)規(guī)定:(1)理解glut程序框架////(2)理解窗口到視區(qū)的變換////(3)理解OpenGL實(shí)現(xiàn)動(dòng)畫的原理////(4)添加代碼實(shí)現(xiàn)中點(diǎn)Bresenham算法畫直線////(5)添加代碼實(shí)現(xiàn)改善Bresenham算法畫直線////(6)添加代碼實(shí)現(xiàn)圓的繪制(可以合適對(duì)框架坐標(biāo)系進(jìn)行修改)////(7)合適修改代碼實(shí)現(xiàn)具有寬度的圖形(線刷子或方刷子)//////////////////////////////////////////////////////////////////////////////#include<windows.h>#include<gl/glut.h>#include"stdio.h"intm_PointNumber=0;//動(dòng)畫時(shí)繪制點(diǎn)的數(shù)目intm_DrawMode=1;//繪制模式1DDA算法畫直線//2中點(diǎn)Bresenham算法畫直線//3改善Bresenham算法畫直線//4八分法繪制圓//5四分法繪制橢圓//繪制坐標(biāo)線voidDrawCordinateLine(void){inti=0;//坐標(biāo)線為黑色 glColor3f(0.0f,0.0f,0.0f); glBegin(GL_LINES);for(i=10;i<=250;i=i+10) { glVertex2f((float)(i),0.0f); glVertex2f((float)(i),250.0f); glVertex2f(0.0f,(float)(i)); glVertex2f(250.0f,(float)(i)); } glEnd();}//繪制一種點(diǎn),這裏用一種正方形表達(dá)一種點(diǎn)。voidputpixel(GLsizeix,GLsizeiy){ glRectf(10*x,10*y,10*x+10,10*y+10);}/////////////////////////////////////////////////////////////////////DDA畫線算法////參數(shù)闡明:x0,y0起點(diǎn)坐標(biāo)////x1,y1終點(diǎn)坐標(biāo)////num掃描轉(zhuǎn)換時(shí)從起點(diǎn)開(kāi)始輸出的點(diǎn)的數(shù)目,用于動(dòng)畫/////////////////////////////////////////////////////////////////////voidDDACreateLine(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum){//設(shè)置顏色 glColor3f(1.0f,0.0f,0.0f);//對(duì)畫線動(dòng)畫進(jìn)行控制if(num==1) printf("DDA畫線算法:各點(diǎn)坐標(biāo)\n");elseif(num==0)return;//畫線算法的實(shí)現(xiàn) GLsizeidx,dy,epsl,k; GLfloatx,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0;if(abs(dx)>abs(dy))epsl=abs(dx);elseepsl=abs(dy); xIncre=(float)dx/epsl; yIncre=(float)dy/epsl;for(k=0;k<=epsl;k++){ putpixel((int)(x+0.5),(int)(y+0.5));if(k>=num-1){ printf("x=%f,y=%f,取整後x=%d,y=%d\n",x,y,(int)(x+0.5),(int)(y+0.5));break; } x+=xIncre; y+=yIncre;if(x>=25||y>=25)break; }}/////////////////////////////////////////////////////////////////////中點(diǎn)Bresenham算法畫直線(0<=k<=1)////參數(shù)闡明:x0,y0起點(diǎn)坐標(biāo)////x1,y1終點(diǎn)坐標(biāo)////num掃描轉(zhuǎn)換時(shí)從起點(diǎn)開(kāi)始輸出的點(diǎn)的數(shù)目,用于動(dòng)畫/////////////////////////////////////////////////////////////////////voidBresenhamLine(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum){ glColor3f(1.0f,0.0f,0.0f);if(num==1) { printf("中點(diǎn)Bresenham算法畫直線:各點(diǎn)坐標(biāo)及鑒別式的值\n"); }elseif(num==0)return;//中點(diǎn)Bresenham劃線算法的實(shí)現(xiàn) GLsizeidx,dy,d,UpIncre,DownIncre,x,y;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(x<=x1) { putpixel(x,y); printf("x=%d,y=%d\n",x,y); x++;if(d<0) { y++; d+=UpIncre; }else d+=DownIncre; }}/////////////////////////////////////////////////////////////////////改善的Bresenham算法畫直線(0<=k<=1)////參數(shù)闡明:x0,y0起點(diǎn)坐標(biāo)////x1,y1終點(diǎn)坐標(biāo)////num掃描轉(zhuǎn)換時(shí)從起點(diǎn)開(kāi)始輸出的點(diǎn)的數(shù)目,用于動(dòng)畫/////////////////////////////////////////////////////////////////////voidBresenham2Line(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum){ glColor3f(1.0f,0.0f,0.0f);if(num==1) printf("改善的Bresenham算法畫直線:各點(diǎn)坐標(biāo)及鑒別式的值\n");elseif(num==0)return;//畫線算法的實(shí)現(xiàn) GLsizeix,y,dx,dy,e; dx=x1-x0; dy=y1-y0; e=-dx;x=x0;y=y0;while(x<=x1) { putpixel(x,y); printf("x=%d,y=%d\n",x,y); x++; e=e+2*dy;if(e>0) { y++; e=e-2*dx; } }}/////////////////////////////////////////////////////////////////////Bresenham算法畫圓////參數(shù)闡明:x,y圓心坐標(biāo)////R圓半徑////num掃描轉(zhuǎn)換時(shí)從起點(diǎn)開(kāi)始輸出的點(diǎn)的數(shù)目,用于動(dòng)畫/////////////////////////////////////////////////////////////////////voidBresenhamCircle(GLsizeix,GLsizeiy,GLsizeiR,GLsizeinum){ glColor3f(1.0f,0.0f,0.0f);if(num==1) printf("Bresenham算法畫圓:各點(diǎn)坐標(biāo)及鑒別式的值\n");intd,k=0,xa,ya; xa=0;ya=R;d=1-R;while(xa<=ya){ putpixel(xa+x,ya+y); putpixel(ya+x,xa+y); putpixel(-ya+x,xa+y); putpixel(-xa+x,ya+y); putpixel(-xa+x,-ya+y); putpixel(-ya+x,-xa+y); putpixel(ya+x,-xa+y); putpixel(xa+x,-ya+y);if(k>=num-1){ printf("x=%d,y=%d\n",xa+x,ya+y);break; } k++;if(d<0)d+=2*xa+3;else{ d+=2*(xa-ya)+5; ya--; } xa++; } }//初始化窗口voidInitial(void){//設(shè)置窗口顏色為藍(lán)色glClearColor(1.0f,1.0f,1.0f,1.0f);}//窗口大小變化時(shí)調(diào)用的登記函數(shù)voidChangeSize(GLsizeiw,GLsizeih){if(h==0) h=1;//設(shè)置視區(qū)尺寸 glViewport(0,0,w,h);//重置坐標(biāo)系統(tǒng) glMatrixMode(GL_PROJECTION); glLoadIdentity();//建立修剪空間的范圍if(w<=h) glOrtho(0.0f,250.0f,0.0f,250.0f*h/w,1.0,-1.0);else glOrtho(0.0f,250.0f*w/h,0.0f,250.0f,1.0,-1.0);}//在窗口中繪制圖形voidReDraw(void){//用目前背景色填充窗口 glClear(GL_COLOR_BUFFER_BIT);//畫出坐標(biāo)線 DrawCordinateLine();switch(m_DrawMode) {case1: DDACreateLine(0,0,20,15,m_PointNumber);break;case2: BresenhamLine(0,0,20,15,m_PointNumber);break;case3: Bresenham2Line(1,1,8,6,m_PointNumber);break;case4: BresenhamCircle(12,12,10,m_PointNumber);break;default:break; }glFlush();}//設(shè)置時(shí)間回調(diào)函數(shù)voidTimerFunc(intvalue){if(m_PointNumber==0) value=1; m_PointNumber=value; glutPostRedisplay(); glutTimerFunc(500,TimerFunc,value+1);}//設(shè)置鍵盤回調(diào)函數(shù)voidKeyboard(unsignedcharkey,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();}intmain(intargc,char*argv[]){ glutInit(&argc,argv);//初始化GLUT庫(kù)OpenGL窗口的顯示模式 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(600,600); glutInitWindowPosition(100,100); glutCreateWindow("基本圖元繪制程序"); glutDisplayFunc(ReDraw);glutReshapeFunc(ChangeSize); glutKeyboardFunc(Keyboard);//鍵盤響應(yīng)回調(diào)函數(shù) glutTimerFunc(500,TimerFunc,1);//窗口初始化Initial(); glutMainLoop();//啟動(dòng)主GLUT事件處理循環(huán)return0;}試驗(yàn)二:太陽(yáng)系模型動(dòng)畫一、試驗(yàn)?zāi)康倪\(yùn)用OpenGL圖形軟件包,建立太陽(yáng)、地球和月亮的運(yùn)動(dòng)模型;增長(zhǎng)光照系統(tǒng),模擬太陽(yáng)、地球和月亮的光照環(huán)境;并運(yùn)用雙緩存技術(shù),用動(dòng)畫方式顯示模型。以加深學(xué)生對(duì)幾何變換、投影變換以及觀測(cè)變換的理解,并提高學(xué)生運(yùn)用圖形軟件包繪制圖形的能力。二、試驗(yàn)內(nèi)容環(huán)節(jié)和實(shí)現(xiàn):首先進(jìn)行初始化工作,進(jìn)行顯示模式和窗口等設(shè)定,然後重要實(shí)現(xiàn)根據(jù)兩個(gè)函數(shù),一種是通過(guò)重繪,這樣在你移動(dòng)或者變化窗口大小的時(shí)候可以保持程序還是正常是實(shí)現(xiàn)繪圖模式,此外一種就是通過(guò)渲染,由于是一種動(dòng)態(tài)的變化,因此需要時(shí)間函數(shù)來(lái)控制變化狀況,分別在主窗口部分繪制太陽(yáng),地球和月亮,其中對(duì)于地球和月亮需要設(shè)置旋轉(zhuǎn)角度和平移,而太陽(yáng)是靜態(tài)圖形,很好繪制,直接調(diào)用繪圖函數(shù)即可,并且由于旋轉(zhuǎn)變化的原因,超過(guò)360度要處理,因此需要設(shè)定步長(zhǎng),最終通過(guò)主循環(huán)和時(shí)間來(lái)控制動(dòng)態(tài)顯示,直到顧客關(guān)閉。三、試驗(yàn)成果四、體會(huì)這次試驗(yàn)學(xué)會(huì)了用OpenGL繪制球體,和使用光照繪出具有真實(shí)感圖形的措施,其中重要用到glutSolidSphere,glLightfv,glEnable函數(shù)來(lái)繪制球體和啟用光照,并且在設(shè)置光照時(shí)還可對(duì)光的顏色進(jìn)行設(shè)置,此外對(duì)OpenGL中深度的概念也有一定理解,不過(guò)詳細(xì)使用還需要深入理解。五、源程序源代碼:#include<windows.h>#include<gl/gl.h>#include<gl/glu.h>#include<gl/glut.h>voidInitial(){ glEnable(GL_DEPTH_TEST); //啟用深度測(cè)試glFrontFace(GL_CCW); //指定逆時(shí)針繞法表達(dá)正面glClearColor(1.0f,1.0f,1.0f,1.0f); //背景為黑色}voidSetupRC(){//設(shè)置光源LIGHT0的參數(shù) GLfloatlight_diffuse[]={1.0f,1.0f,1.0f,1.0f}; GLfloatlight_ambient[]={0.0f,0.5f,0.5f,1.0f}; glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse); glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);//使光源有效 glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);//啟動(dòng)深度測(cè)試 glEnable(GL_DEPTH_TEST); glClearColor(0.0f,0.0f,0.0f,1.0f);}voidChangeSize(intw,inth){if(h==0) h=1;//設(shè)置視區(qū)尺寸 glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity();//設(shè)置修剪空間 GLfloatfAspect; fAspect=(float)w/(float)h; gluPerspective(45.0,fAspect,1.0,500.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}voidRenderScene(void){//繞太陽(yáng)旋轉(zhuǎn)的角度staticfloatfElect1=0.0f;staticfloatfElect2=0.0f; GLfloatposition[]={0.0f,0.0f,0.0f,1.0f}; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity();//重置模型視圖矩陣 glTranslatef(0.0f,0.0f,-250.0f); //將圖形沿z軸負(fù)向移動(dòng) glLightfv(GL_LIGHT0,GL_POSITION,posi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國(guó)柔性環(huán)形高強(qiáng)纖維索具行業(yè)投資前景及策略咨詢研究報(bào)告
- 洗車池加固施工方案范本
- 錦州醫(yī)科大學(xué)《神經(jīng)生物學(xué)與腦科學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025至2031年中國(guó)大樹(shù)移植成活液行業(yè)投資前景及策略咨詢研究報(bào)告
- 新疆地暖施工方案編制
- 《團(tuán)隊(duì)成果展示》課件
- 2025至2030年中國(guó)車用電路數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)脂肪酸結(jié)合蛋白數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年探討農(nóng)村土地使用權(quán)轉(zhuǎn)讓合同的法律效力問(wèn)題
- 增城降水井施工方案審批
- 第1課時(shí) 化學(xué)方程式的意義及書寫課件2024-2025學(xué)年人教版九年級(jí)化學(xué)
- 《數(shù)字圖像處理課程設(shè)計(jì)》課程教學(xué)大綱
- 園藝大棚建設(shè)合同
- 冠狀動(dòng)脈粥樣硬化性心臟病-28
- 藥用氧化鎂項(xiàng)目營(yíng)銷計(jì)劃書
- 任務(wù)1 混合動(dòng)力汽車轉(zhuǎn)向系統(tǒng)典型構(gòu)造與檢修
- 三維地籍解決方案白皮書
- 住院患者VTE相關(guān)評(píng)估量表課件
- 高中物理選修二第一章《安培力與洛倫茲力》測(cè)試題(含答案解析)
- 江蘇省徐州市睢寧縣2023-2024學(xué)年七年級(jí)下學(xué)期期中考試數(shù)學(xué)試卷(含答案)
- 專題13 統(tǒng)計(jì)與概率-【好題匯編】五年(2020-2024)高考數(shù)學(xué)真題分類匯編(含答案解析)
評(píng)論
0/150
提交評(píng)論