版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
計算機(jī)圖形學(xué)實驗報告班級:軟工0801班學(xué)號:U18013姓名:嚴(yán)森指導(dǎo)教師:萬琳完畢曰期:-11-3華中科技大學(xué)軟件學(xué)院試驗一:基本圖元繪制試驗?zāi)康睦斫釵penGL圖形軟件包繪制圖形的基本過程及其程序框架,并在已經(jīng)有的程序框架中添加代碼實現(xiàn)直線和圓的生成算法,演示直線和圓的生成過程,從而加深對直線和圓等基本圖形生成算法的理解。二、試驗內(nèi)容試驗操作和環(huán)節(jié):本次試驗重要的目的是為了掌握基本畫線和畫圓算法,對于書上給出的代碼,規(guī)定通過本次試驗來詳細(xì)的實現(xiàn)。由于試驗已經(jīng)給出大體的框架,因此只需要按照書上的算法思想來設(shè)計詳細(xì)實現(xiàn)代碼,對于直線DDA算法,中點Bresenham算法及其改善算法,以及Bresenham畫圓算法均有深入的體會。DDA算法是對每一步都要進(jìn)行增量處理,然後取整,繪制,而Bresenham通過判斷誤差函數(shù)和求取遞推公式來實現(xiàn)。尤其是對于整數(shù)的選擇取舍,以及代碼的流程和循環(huán)的控制有一種深入的理解。同步也純熟運用OpenGL基本的繪圖函數(shù)。三、試驗成果1-1. DDA算法畫直線。
圖1-1-1,顯示每次DDA算法畫線的坐標(biāo)成果(如上)。圖1-1-2.顯示DDA算法畫圓過程及截圖1-2. 中點Bresenham算法畫直線1-2-1運用中點Bresenham算法畫直線的各點坐標(biāo)如上:1-2-2.中點Bresenham畫線算法畫線過程截圖1-3. 運用改善的Bresenham畫線算法來畫圖1-3-1.運用改善的Bresenham算法來畫圖各點坐標(biāo)如上:1-3-2.運用改善的Bresenham算法畫直線圖形如上1-4.運用Bresenham畫圓算法來作圖1-4-1.運用Bresenham畫圓法作圖各點坐標(biāo)如上:1-4-2.運用Bresenham畫圓法作圖及截圖如上。四、體會通過本次試驗,我深入加深了對于基本畫圖算法的理解。尤其是對于DDA,Bresenham和畫圓算法。其中,DDA算法由于每一步都要處理浮點數(shù)的四舍五入,因此在繪圖時要進(jìn)行取整,效率較低,不過代碼直觀好懂,符合原理。而對于Bresenham及其改善算法,都是在理論推導(dǎo)的基礎(chǔ)上來實現(xiàn)的,然後通過整數(shù)化,形成了一種高效率的畫圖算法,因此需要合適的理解,尤其是對于取整操作判斷比較巧妙,實現(xiàn)了防止多次判斷計算浮點數(shù)的目的,因此比較高效。而繪制圓形的時候,用到的基本思想還是和Bresenham畫圖算法同樣,只不過需要注意的是八分法畫圓,這樣只需要繪制其中的八分之一就可以運用對稱的關(guān)系來繪制出整個
圖形。而對于與否走下一步,或者是停留,判斷的根據(jù)還是誤差函數(shù),和前面的思想是類似。此外,通過試驗訓(xùn)練了自已的編程能力,同步熟悉了OpenGL繪圖的函數(shù)和流程,也深入鞏固了有關(guān)的知識。五、源程序源代碼如下://////////////////////////////////////////////////////////////////////////////試驗規(guī)定:(1)理解glut程序框架////(2)理解窗口到視區(qū)的變換////(3)理解OpenGL實現(xiàn)動畫的原理////(4)添加代碼實現(xiàn)中點Bresenham算法畫直線////(5)添加代碼實現(xiàn)改善Bresenham算法畫直線////(6)添加代碼實現(xiàn)圓的繪制(可以合適對框架坐標(biāo)系進(jìn)行修改)////(7)合適修改代碼實現(xiàn)具有寬度的圖形(線刷子或方刷子)//////////////////////////////////////////////////////////////////////////////#include<windows.h>#include<gl/glut.h>#include"stdio.h"intm_PointNumber=0;//動畫時繪制點的數(shù)目intm_DrawMode=1;//繪制模式1DDA算法畫直線//2中點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();}//繪制一種點,這裏用一種正方形表達(dá)一種點。voidputpixel(GLsizeix,GLsizeiy){ glRectf(10*x,10*y,10*x+10,10*y+10);}/////////////////////////////////////////////////////////////////////DDA畫線算法////參數(shù)闡明:x0,y0起點坐標(biāo)////x1,y1終點坐標(biāo)////num掃描轉(zhuǎn)換時從起點開始輸出的點的數(shù)目,用于動畫/////////////////////////////////////////////////////////////////////voidDDACreateLine(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum){//設(shè)置顏色 glColor3f(1.0f,0.0f,0.0f);//對畫線動畫進(jìn)行控制if(num==1) printf("DDA畫線算法:各點坐標(biāo)\n");elseif(num==0)return;//畫線算法的實現(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; }}/////////////////////////////////////////////////////////////////////中點Bresenham算法畫直線(0<=k<=1)////參數(shù)闡明:x0,y0起點坐標(biāo)////x1,y1終點坐標(biāo)////num掃描轉(zhuǎn)換時從起點開始輸出的點的數(shù)目,用于動畫/////////////////////////////////////////////////////////////////////voidBresenhamLine(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum){ glColor3f(1.0f,0.0f,0.0f);if(num==1) { printf("中點Bresenham算法畫直線:各點坐標(biāo)及鑒別式的值\n"); }elseif(num==0)return;//中點Bresenham劃線算法的實現(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起點坐標(biāo)////x1,y1終點坐標(biāo)////num掃描轉(zhuǎn)換時從起點開始輸出的點的數(shù)目,用于動畫/////////////////////////////////////////////////////////////////////voidBresenham2Line(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum){ glColor3f(1.0f,0.0f,0.0f);if(num==1) printf("改善的Bresenham算法畫直線:各點坐標(biāo)及鑒別式的值\n");elseif(num==0)return;//畫線算法的實現(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ù)目,用于動畫/////////////////////////////////////////////////////////////////////voidBresenhamCircle(GLsizeix,GLsizeiy,GLsizeiR,GLsizeinum){ glColor3f(1.0f,0.0f,0.0f);if(num==1) printf("Bresenham算法畫圓:各點坐標(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);}//窗口大小變化時調(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è)置時間回調(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庫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();//啟動主GLUT事件處理循環(huán)return0;}試驗二:太陽系模型動畫一、試驗?zāi)康倪\用OpenGL圖形軟件包,建立太陽、地球和月亮的運動模型;增長光照系統(tǒng),模擬太陽、地球和月亮的光照環(huán)境;并運用雙緩存技術(shù),用動畫方式顯示模型。以加深學(xué)生對幾何變換、投影變換以及觀測變換的理解,并提高學(xué)生運用圖形軟件包繪制圖形的能力。二、試驗內(nèi)容環(huán)節(jié)和實現(xiàn):首先進(jìn)行初始化工作,進(jìn)行顯示模式和窗口等設(shè)定,然後重要實現(xiàn)根據(jù)兩個函數(shù),一種是通過重繪,這樣在你移動或者變化窗口大小的時候可以保持程序還是正常是實現(xiàn)繪圖模式,此外一種就是通過渲染,由于是一種動態(tài)的變化,因此需要時間函數(shù)來控制變化狀況,分別在主窗口部分繪制太陽,地球和月亮,其中對于地球和月亮需要設(shè)置旋轉(zhuǎn)角度和平移,而太陽是靜態(tài)圖形,很好繪制,直接調(diào)用繪圖函數(shù)即可,并且由于旋轉(zhuǎn)變化的原因,超過360度要處理,因此需要設(shè)定步長,最終通過主循環(huán)和時間來控制動態(tài)顯示,直到顧客關(guān)閉。三、試驗成果四、體會這次試驗學(xué)會了用OpenGL繪制球體,和使用光照繪出具有真實感圖形的措施,其中重要用到glutSolidSphere,glLightfv,glEnable函數(shù)來繪制球體和啟用光照,并且在設(shè)置光照時還可對光的顏色進(jìn)行設(shè)置,此外對OpenGL中深度的概念也有一定理解,不過詳細(xì)使用還需要深入理解。五、源程序源代碼:#include<windows.h>#include<gl/gl.h>#include<gl/glu.h>#include<gl/glut.h>voidInitial(){ glEnable(GL_DEPTH_TEST); //啟用深度測試glFrontFace(GL_CCW); //指定逆時針繞法表達(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);//啟動深度測試 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){//繞太陽旋轉(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ù)向移動 glLightfv(GL_LIGHT0,GL_POSITION,posi
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 飛機(jī)數(shù)字化技術(shù)
- 2026江蘇無錫市宜興市司法局招聘編外人員2人備考考試試題及答案解析
- 網(wǎng)吧活動的策劃方案(3篇)
- 2026遼寧大連醫(yī)科大學(xué)附屬第一醫(yī)院招聘高層次人才120人參考考試題庫及答案解析
- 城市老街活動策劃方案(3篇)
- 鐵路紅線施工方案(3篇)
- 2026廣西南寧馬山縣人力資源和社會保障局招聘外聘工作人員(就業(yè)專干)1人考試備考試題及答案解析
- 2026廣東廣州銀行選聘備考考試試題及答案解析
- 2026廣東廣州市黃埔區(qū)人民政府黃埔街道辦事處政府聘員招聘1人考試參考題庫及答案解析
- 2026陜西西安管理學(xué)院文員招聘1人參考考試題庫及答案解析
- 2026云南大理州事業(yè)單位招聘48人參考題庫必考題
- 2022年考研英語一真題及答案解析
- 硫培非格司亭二級預(yù)防非小細(xì)胞肺癌化療后中性粒細(xì)胞減少癥的療效和安全性臨床研究
- 八年級下冊冀教版單詞表
- 數(shù)學(xué)-華中師大一附中2024-2025高一上學(xué)期期末試卷和解析
- 某露天礦山剝離工程施工組織設(shè)計方案
- 2024工程項目工序質(zhì)量控制標(biāo)準(zhǔn)
- JGJ-T188-2009施工現(xiàn)場臨時建筑物技術(shù)規(guī)范
- 互聯(lián)網(wǎng)+物流平臺項目創(chuàng)辦商業(yè)計劃書(完整版)
- 家庭學(xué)校社會協(xié)同育人課件
- 基于python-的車牌識別
評論
0/150
提交評論