計算機(jī)圖形學(xué)實驗報告模板_第1頁
計算機(jī)圖形學(xué)實驗報告模板_第2頁
計算機(jī)圖形學(xué)實驗報告模板_第3頁
計算機(jī)圖形學(xué)實驗報告模板_第4頁
計算機(jī)圖形學(xué)實驗報告模板_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

巢湖學(xué)院計算機(jī)圖形學(xué)實驗報告(模板)本課程實驗包括:實驗一、VC++圖形程序設(shè)計環(huán)境搭建實驗二、基本圖形生成(一):畫線實驗三、基本圖形生成(二):畫圓實驗四、基本圖形生成(三):畫多邊形(生成三角形)實驗五、基本圖形處理(一):形變(放大、平移、旋轉(zhuǎn))實驗六、基本圖形處理(二):裁剪(多邊形裁剪)以下為實驗二和實驗三模板實驗一:基本圖元繪制實驗?zāi)康牧私釵penGL圖形軟件包繪制圖形的基本過程及其程序框架,并在已有的程序框架中添加代碼實現(xiàn)直線和圓的生成算法,演示直線和圓的生成過程,從而加深對直線和圓等基本圖形生成算法的理解。二、實驗內(nèi)容實驗操作和步驟:本次實驗主要的目的是為了掌握基本畫線和畫圓算法,對于書上給出的代碼,要求通過本次試驗來具體的實現(xiàn)。由于實驗已經(jīng)給出大體的框架,所以只需要按照書上的算法思想來設(shè)計具體實現(xiàn)代碼,對于直線DDA算法,中點(diǎn)Bresenham算法及其改進(jìn)算法,以及Bresenham畫圓算法都有進(jìn)一步的體會。DDA算法是對每一步都要進(jìn)行增量處理,然后取整,繪制,而Bresenham通過判斷誤差函數(shù)和求取遞推公式來實現(xiàn)。特別是對于整數(shù)的選擇取舍,以及代碼的流程和循環(huán)的控制有一個深入的了解。同時也熟練運(yùn)用OpenGL基本的繪圖函數(shù)。三、體會 通過本次試驗,我進(jìn)一步加深了對于基本畫圖算法的理解。特別是對于DDA,Bresenham和畫圓算法。其中,DDA算法由于每一步都要處理浮點(diǎn)數(shù)的四舍五入,所以在繪圖時要進(jìn)行取整,效率較低,但是代碼直觀好懂,符合原理。而對于Bresenham及其改進(jìn)算法,都是在理論推導(dǎo)的基礎(chǔ)上來實現(xiàn)的,然后經(jīng)過整數(shù)化,形成了一個高效率的畫圖算法,所以需要適當(dāng)?shù)睦斫?,特別是對于取整操作判斷比較巧妙,實現(xiàn)了避免多次判斷計算浮點(diǎn)數(shù)的目的,所以比較高效。而繪制圓形的時候,用到的基本思想還是和Bresenham畫圖算法一樣,只不過需要注意的是八分法畫圓,這樣只需要繪制其中的八分之一就可以利用對稱的關(guān)系來繪制出整個

圖形。而對于是否走下一步,或者是停留,判斷的依據(jù)還是誤差函數(shù),和前面的思想是類似。另外,通過實驗訓(xùn)練了自己的編程能力,同時熟悉了OpenGL繪圖的函數(shù)和流程,也進(jìn)一步鞏固了相關(guān)的知識。五、源程序注意:代碼部分只要給出畫圖的子函數(shù)就可以,不需要向下面一樣給出全部代碼。源代碼如下://////////////////////////////////////////////////////////////////////////////實驗要求:(1)理解glut程序框架////(2)理解窗口到視區(qū)的變換////(3)理解OpenGL實現(xiàn)動畫的原理////(4)添加代碼實現(xiàn)中點(diǎn)Bresenham算法畫直線////(5)添加代碼實現(xiàn)改進(jìn)Bresenham算法畫直線////(6)添加代碼實現(xiàn)圓的繪制(可以適當(dāng)對框架坐標(biāo)系進(jìn)行修改)////(7)適當(dāng)修改代碼實現(xiàn)具有寬度的圖形(線刷子或方刷子)//////////////////////////////////////////////////////////////////////////////#include<windows.h>#include<gl/glut.h>#include"stdio.h"intm_PointNumber=0;//動畫時繪制點(diǎn)的數(shù)目intm_DrawMode=1;//繪制模式1DDA算法畫直線//2中點(diǎn)Bresenham算法畫直線//3改進(jìn)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),這里用一個正方形表示一個點(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)換時從起點(diǎn)開始輸出的點(diǎn)的數(shù)目,用于動畫/////////////////////////////////////////////////////////////////////voidDDACreateLine(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum){ //設(shè)置顏色 glColor3f(1.0f,0.0f,0.0f); //對畫線動畫進(jìn)行控制 if(num==1) printf("DDA畫線算法:各點(diǎn)坐標(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; }}/////////////////////////////////////////////////////////////////////中點(diǎn)Bresenham算法畫直線(0<=k<=1)////參數(shù)說明:x0,y0起點(diǎn)坐標(biāo)////x1,y1終點(diǎn)坐標(biāo)////num掃描轉(zhuǎn)換時從起點(diǎn)開始輸出的點(diǎn)的數(shù)目,用于動畫/////////////////////////////////////////////////////////////////////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劃線算法的實現(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; }}/////////////////////////////////////////////////////////////////////改進(jìn)的Bresenham算法畫直線(0<=k<=1)////參數(shù)說明:x0,y0起點(diǎn)坐標(biāo)////x1,y1終點(diǎn)坐標(biāo)////num掃描轉(zhuǎn)換時從起點(diǎn)開始輸出的點(diǎn)的數(shù)目,用于動畫/////////////////////////////////////////////////////////////////////voidBresenham2Line(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum){ glColor3f(1.0f,0.0f,0.0f); if(num==1) printf("改進(jìn)的Bresenham算法畫直線:各點(diǎn)坐標(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)換時從起點(diǎn)開始輸出的點(diǎn)的數(shù)目,用于動畫/////////////////////////////////////////////////////////////////////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);}//窗口大小改變時調(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){ //用當(dāng)前背景色填充窗口 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_P

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論