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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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)告模板7500字

巢湖學(xué)院計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)報(bào)告(模板)本課程實(shí)驗(yàn)包括:以下為實(shí)驗(yàn)二和實(shí)驗(yàn)三模板實(shí)驗(yàn)一:基本圖元繪制一、實(shí)驗(yàn)?zāi)康牧私釵penGL圖形軟件包繪制圖形的基本過程及其程序框架,并在已有的程序框架中添加代碼實(shí)現(xiàn)直線和圓的生成算法,演示直線和圓的生成過程,從而加深對(duì)直線和圓等基本圖形生成算法的理解。二、實(shí)驗(yàn)內(nèi)容實(shí)驗(yàn)操作和步驟:本次實(shí)驗(yàn)主要的目的是為了掌握基本畫線和畫圓算法,對(duì)于書上給出的代碼,要求通過本次試驗(yàn)來具體的實(shí)現(xiàn)。由于實(shí)驗(yàn)已經(jīng)給出大體的框架,所以只需要按照書上的算法思想來設(shè)計(jì)具體實(shí)現(xiàn)代碼,對(duì)于直線DDA算法,中點(diǎn)Bresenham算法及其改進(jìn)算法,以及Bresenham畫圓算法都有進(jìn)一步的體會(huì)。DDA算法是對(duì)每一步都要進(jìn)行增量處理,然后取整,繪制,而Bresenham通過判斷誤差函數(shù)和求取遞推公式來實(shí)現(xiàn)。特別是對(duì)于整數(shù)的選擇取舍,以及代碼的流程和循環(huán)的控制有一個(gè)深入的了解。同時(shí)也熟練運(yùn)用OpenGL基本的繪圖函數(shù)。三、體會(huì)通過本次試驗(yàn),我進(jìn)一步加深了對(duì)于基本畫圖算法的理解。特別是對(duì)于DDA,Bresenham和畫圓算法。其中,DDA算法由于每一步都要處理浮點(diǎn)數(shù)的四舍五入,所以在繪圖時(shí)要進(jìn)行取整,效率較低,但是代碼直觀好懂,符合原理。而對(duì)于Bresenham及其改進(jìn)算法,都是在理論推導(dǎo)的基礎(chǔ)上來實(shí)現(xiàn)的,然后經(jīng)過整數(shù)化,形成了一個(gè)高效率的畫圖算法,所以需要適當(dāng)?shù)睦斫?,特別是對(duì)于取整操作判斷比較巧妙,實(shí)現(xiàn)了避免多次判斷計(jì)算浮點(diǎn)數(shù)的目的,所以比較高效。而繪制圓形的時(shí)候,用到的基本思想還是和Bresenham畫圖算法一樣,只不過需要注意的是八分法畫圓,這樣只需要繪制其中的八分之一就可以利用對(duì)稱的關(guān)系來繪制出整個(gè)圖形。而對(duì)于是否走下一步,或者是停留,判斷的依據(jù)還是誤差函數(shù),和前面的思想是類似。另外,通過實(shí)驗(yàn)訓(xùn)練了自己的編程能力,同時(shí)熟悉了OpenGL繪圖的函數(shù)和流程,也進(jìn)一步鞏固了相關(guān)的知識(shí)。五、源程序注意:代碼部分只要給出畫圖的子函數(shù)就可以,不需要向下面一樣給出全部代碼。源代碼如下://////////////////////////////////////////////////////////////////////////////實(shí)驗(yàn)要求:(1)理解glut程序框架////(2)理解窗口到視區(qū)的變換////(3)理解OpenGL實(shí)現(xiàn)動(dòng)畫的原理////(4)添加代碼實(shí)現(xiàn)中點(diǎn)Bresenham算法畫直線////(5)添加代碼實(shí)現(xiàn)改進(jìn)Bresenham算法畫直線////(6)添加代碼實(shí)現(xiàn)圓的繪制(可以適當(dāng)對(duì)框架坐標(biāo)系進(jìn)行修改)////(7)適當(dāng)修改代碼實(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改進(jìn)Bresenham算法畫直線//4八分法繪制圓//5四分法繪制橢圓//繪制坐標(biāo)線voidDrawCordinateLine(void){}//繪制一個(gè)點(diǎn),這里用一個(gè)正方形表示一個(gè)點(diǎn)。voidputpixel(GLsizeix,GLsizeiy){}/////////////////////////////////////////////////////////////////////DDA畫線算法////參數(shù)說明:x0,y0起點(diǎn)坐標(biāo)////x1,y1終點(diǎn)坐標(biāo)////num掃描轉(zhuǎn)換時(shí)從起點(diǎn)開始輸出的點(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");return;elseif(num==0)//畫線算法的實(shí)現(xiàn)GLsizeidx,dy,epsl,k;GLfloatx,y,xIncre,yIncre;dx=x1-x0;dy=y1-y0;x=x0;glRectf(10*x,10*y,10*x+10,10*y+10);inti=0;//坐標(biāo)線為黑色glColor3f(0.0f,0.0f,0.0f);glBegin(GL_LINES);{}glVertex2f((float)(i),0.0f);glVertex2f((float)(i),250.0f);glVertex2f(0.0f,(float)(i));glVertex2f(250.0f,(float)(i));for(i=10;i<=250;i=i+10)glEnd();}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){}x+=xIncre;y+=yIncre;if(x>=25||y>=25)break;printf("x=%f,y=%f,取整后x=%d,y=%d\n",x,y,(int)(x+0.5),(int)(y+0.5));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)開始輸出的點(diǎn)的數(shù)目,用于動(dòng)畫/////////////////////////////////////////////////////////////////////voidBresenhamLine(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum){glColor3f(1.0f,0.0f,0.0f);if(num==1){}elseif(num==0)return;//中點(diǎn)Bresenham劃線算法的實(shí)現(xiàn)GLsizeidx,dy,d,UpIncre,DownIncre,x,y;if(x0>x1){}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);x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;printf("中點(diǎn)Bresenham算法畫直線:各點(diǎn)坐標(biāo)及判別式的值\n");}}printf("x=%d,y=%d\n",x,y);x++;if(d<0){}elsed+=DownIncre;y++;d+=UpIncre;/////////////////////////////////////////////////////////////////////改進(jìn)的Bresenham算法畫直線(0<=k<=1)////參數(shù)說明:x0,y0起點(diǎn)坐標(biāo)////x1,y1終點(diǎn)坐標(biāo)////num掃描轉(zhuǎn)換時(shí)從起點(diǎn)開始輸出的點(diǎn)的數(shù)目,用于動(dòng)畫/////////////////////////////////////////////////////////////////////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");return;elseif(num==0)//畫線算法的實(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)開始輸出的點(diǎn)的數(shù)目,用于動(dòng)畫/////////////////////////////////////////////////////////////////////voidBresenhamCircle(GLsizeix,GLsizeiy,GLsizeiR,GLsizeinum){}//初始化窗口voidInitial(void){//設(shè)置窗口顏色為藍(lán)色glClearColor(1.0f,1.0f,1.0f,1.0f);}//窗口大小改變時(shí)調(diào)用的登記函數(shù)voidChangeSize(GLsizeiw,GLsizeih)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){}k++;if(d<0)d+=2*xa+3;else{}xa++;d+=2*(xa-ya)+5;ya--;printf("x=%d,y=%d\n",xa+x,ya+y);break;glColor3f(1.0f,0.0f,0.0f);{}//在窗口中繪制圖形voidReDraw(void){glFlush();}//畫出坐標(biāo)線DrawCordinateLine();switch(m_DrawMode){case1:}DDACreateLine(0,0,20,15,m_PointNumber);break;BresenhamLine(0,0,20,15,m_PointNumber);break;Bresenham2Line(1,1,8,6,m_PointNumber);break;BresenhamCircle(12,12,10,m_PointNumber);break;break;//用當(dāng)前背景色填充窗口glClear(GL_COLOR_BUFFER_BIT);if(h==0)h=1;//設(shè)置視區(qū)尺寸//重置坐標(biāo)系統(tǒng)glMatrixMode(GL_PROJECTION);glLoadIdentity();//建立修剪空間的范圍glOrtho(0.0f,250.0f,0.0f,250.0f*h/w,1.0,-1.0);glOrtho(0.0f,250.0f*w/h,0.0f,250.0f,1.0,-1.0);glViewport(0,0,w,h);if(w<=h)elsecase2:case3:case4:default://設(shè)置時(shí)間回調(diào)函數(shù)voidTimerFunc(intvalue){}//設(shè)置鍵盤回調(diào)函數(shù)voidKeyboard(unsignedcharkey,intx,inty){if(key=='1')m_DrawMode=1;}intmain(intargc,char*argv[]){}glutCrea

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論