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

下載本文檔

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

文檔簡介

計算機圖形學

實驗一:基本圖形生成算法演示

一、實驗目的與規(guī)定

了解OpenGL圖形軟件包繪制圖形的基本過程及其程序框架,并在已有的程序框架中

添加代碼實現(xiàn)直線和圓的生成算法,演示直線和圓的生成過程,從而加深對直線和圓等基本

圖形生成算法的理解。

二、實驗內(nèi)容

實驗規(guī)定:(1)理解g1ut程序框架

(2)理解窗口到視區(qū)的變換

(3)理解。PenGL實現(xiàn)動畫的原理

(4)添加代碼實現(xiàn)中點Bresenham算法畫直線

(5)添加代碼實現(xiàn)改善Bresenham算法畫直線

(6)添加代碼實現(xiàn)圓的繪制(可以適當對框架坐標系進行修改)

實驗操作和環(huán)節(jié):本次實驗重要的目的是為了掌握基本畫線和畫圓算法,對于書上給出的代

碼,規(guī)定通過本次實驗來具體的實現(xiàn)。由于實驗已經(jīng)給出大體的框架,所以只需要按照書上

的算法思想來設計具體實現(xiàn)代碼,對于直線DDA算法,中點Bresenham算法及其改善算

法,以及Bresenham畫圓算法都有進一步的體會。DDA算法是對每一步都要進行增量解

決,然后取整,繪制,而Bresenham通過判斷誤差函數(shù)和求取遞推公式來實現(xiàn)。特別是對

于整數(shù)的選擇取舍,以及代碼的流程和循環(huán)的控制有一個進一步的了解。同時也純熟運用Op

enGL基本的繪圖函數(shù)。

三、實驗結果

1-1.。。DDA算法畫直線。

冕JC:\Yindows\systea32\cad.-lalxi

DDA畫線算法:各點坐標

x=0.000000,y=0.000000,取整后x=0,y=0

x?l.000000,y=0.7S0000,前整后

x=2.000000,y=l.500003,戢整后x=2,y=2

x-3.000000,y-2.250000,x-3,y=2

x=4.000000,y=3.000000,x=4,y=3

x=5.000000.y?3.750000,x-5,ya4

x=6.000000,y=4.500000,x=6,y=5

xa7.000000,y?5.250000,

x=8.000000,y=6.000000,x=8,y=6

x=9.000000.y=6.750000,取x=9.y"

x=10.000000,y=7.500000,目x=10,y=8

x=ll.000000,y=8.250000,^/?x=ll,y=8

x=12.000000,y=9.000000,J??'x=12,y=9

x=13.000000,y=9.750000,雙?x=13,y,B10

x=14.000000,y=10.500000,i□x=14,y=ll

x=15.000000.y=11.250000,gx=15,y=ll

x=16.000000,y=12.000000,gx=16,y=12

x=17.000000,y=12.750000,gx=17,y=13

x=18.000000,y=13.500000,gx=18,?/=14

x=19.000000,y=14.250000,gx=19,y=14

x=20.000000,y=15.000000,□x=20,y=15

Ld

圖1-1-1,顯示每次DDA算法畫線的坐標結果(如上)。

圖顯示DDA算法畫圓過程及截圖

1—2.。中點Bresenham算法畫直線

1-3.運用改善的Bresenham畫線算法來畫圖

Asystea32\cad.exe-laix|

Bresenham算法來畫圖各點坐標如上:

運用改善的Bresenham算法畫直線圖形如上

1-4.運用Bresenham畫圓算法來作圖

1-4-1.運用Bresenham畫圓法作圖各點坐標如上:

1-4-2.運用BresenhamlEj圓法作圖及截圖如上。

四、體會

。通過本次實驗,我進一步加深了對于基本畫圖算法的理解。特別是對于DDA,Bresenham

和畫圓算法。其中,DDA算法由于每一步都要解決浮點數(shù)的四舍五入,所以在繪圖時要進行取

整,效率較低,但是代碼直觀好懂,符合原理。而對于Bresenham及其改善算法,都是在理

論推導的基礎上來實現(xiàn)的,然后通過整數(shù)化,形成了一個高效率的畫圖算法,所以需要適當?shù)?/p>

理解,特別是對于取整操作判斷比較巧妙,實現(xiàn)了避免多次判斷計算浮點數(shù)的目的,所以比較

高效。而繪制圓形的時候,用到的基本思想還是和Bresenham畫圖算法同樣,只但是需

要注意的是八分法畫圓,這樣只需要繪制其中的八分之一就可以運用對稱的關系來繪制出整

個圖形。而對于是否走下一步,或者是停留,判斷的依據(jù)還是誤差函數(shù),和前面的思想是類

似。此外,通過實驗訓練了自己的編程能力,同時熟悉了OpenGL繪圖的函數(shù)和流程,也進一

步鞏固了相關的知識。

五、源程序

源代碼如下:

//un//////nn/mmumunmmun/1/1/1/n/urn////1///nu/1/nn

//實驗規(guī)定:(I)理解glut程序框架//

//(2)理解窗口到視區(qū)的變換//

//(3)理解OpenGL實現(xiàn)動畫的原理//

//(4)添加代碼實現(xiàn)中點Bresenham算法畫直線//

II(5)添加代碼實現(xiàn)改善Bresenham算法畫直線〃

//(6)添加代碼實現(xiàn)圓的繪制(可以適當對框架坐標系進行修改)〃

//(7)適當修改代碼實現(xiàn)具有寬度的圖形(線刷子或方刷子)//

////////ini//////////////////////////////////////////mum///m////////

#include<windows.h>

#include<gl/glut.h>

#inc1udcnstdio.h"

intm_PointNumber=0;〃動畫時繪制點的數(shù)目

intm_DrawMode=1;〃繪制模式1DDA算法畫直線

//2中點Bresenham算法畫直線

//3改善Brcsenham算法畫直線

//4八分法繪制圓

//5四分法繪制橢圓

//繪制坐標線

voidDrawCordinateLine(void)

(

?inti=0;

“/坐標線為黑色

oglColor3f(0.Of,0.Of,0.0f);

oglBegin(GL_LINES);

for(i=10;i<=250;i=i+10)

3{

。oglVertex2f((float)(i),O.Of);

.gIVertex2f((float)⑴,250.0f);

。。glVertex2f(0.Of,(float)(i));

gglVertex2f(250.0f,(float)(i));

do|

oglEnd();

)

〃繪制一個點,這里用一個正方形表達一個點。

voidputpixel(GLsizeix,GLsizeiy)

og1Rectf(10*xJ0*y,10*x+10,10*y+10);

/////////////////////////////////〃〃/////〃〃//〃//〃〃〃//〃〃〃/

//DDA畫線算法

//參數(shù)說明:x0,yO起點坐標//

Uxl,yl終點坐標//

//num掃描轉換時從起點開始輸出的點的數(shù)目,用于動畫//

///////////////////////////////////////////////////////////////////

voidDDACreateLine(GLsizeix0,GLsizeiyO,GLsizeix1,GLsizeiy1,GLsizeinum)

(

〃設立顏色

oglColor3f(l.Of,O.Of,O.OD;

〃對畫線動畫進行控制

if(num==1)

叩rintf("DDA畫線算法:各點坐標\n");

?elseif(num==0)

etum;

//畫線算法的實現(xiàn)

?GLsizeidx,dy,eps1,k;

GLfloatx,y,xlncre,yIncre;

?dx=x1-x0;

dy=y1-yO;

ex=xO;

y=y0;

?if(abs(dx)>abs(dy))cpsl=abs(dx);

?elseeps1=abs(dy);

oxincre=(float)dx/epsi;

yincre=(float)dy/epsl;

for(k=0;kv=eps1;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));

。ftbreak;

oo|

+=xIncre;

。y+=yIncre;

Mf(x>=25||y>=25)break;

)

)

ilil////////////////////////////////////1HUH////////////////////

//中點Bresenham算法畫直線(0<=k<=l)//

//參數(shù)說明:x0,yO起點坐標//

//xl,yl終點坐標//

//num掃描轉換時從起點開始輸出的點的數(shù)目,用于動畫〃

1/1//////////////////////////////////////////////////1111//////////

voidBresenhamLine(GLsizeixO,GLsizeiyO,GLsizeixl,GLsizeiyl,GLsizeinum)

(

-glColor3f(l.Of,0.0f,0.Of);

if(num==1)

。(

叩rintf(n中點Bresenham算法畫直線:各點坐標及判別式的值5”);

?elseif(num==0)

?return;

?!ㄖ悬cBrcsenham劃線算法的實現(xiàn)

<>GLsizeidx>dy,d,Uplncre?Downlncre,x,y;

if(x0>xl){

x=x1;x1=x0;x0=x;

y=y1;yl=yO;y0=y;

)

x=xO;y=yO;

dx=x1-xO;dy=y1-yO;

d=dx-2*dy;

UpIncre=2*dx—2*dy;DownIncre=-2*dy:

while(x<=x1)

{

。putpixe1(x,y);

。printf(Hx=%d,y=%d\n",x,y);

◎x++;

“f(d<0)

U

y++;

d+=UpIncre;

)

else

g。d+=Downlncre;

。}

)

///////////////////////////////////////////////////////////////////

//改善的Bresenham算法畫直線(0〈二k<=1)//

//參數(shù)說明:xO,y0起點坐標//

//xl,yl終點坐標//

//num掃描轉換時從起點開始輸出的點的數(shù)目,用于動畫〃

///////////////////////////////////////////////////////////////////

voidBresenham2Line(GLsizeix0,GLsizeiy0,GLsizeixl,GLsizeiy1,GLsizei

um)

(

0gleolor3f(1.0f,0.0f,0.Of);

dif(num==1)

gprintf("改善的Bresenham算法畫直線:各點坐標及判別式的值\n");

delseif(num==0)

?return;

〃畫線算法的實現(xiàn)

GLsizeix,y,dx,dy,e;

dx=x1-x0;

dy=yl-y0;

?e=—dx;x=xO;y=yO;

awhile(x<=xl)

putpixe1(x,y);

。printf(,rx=%d,y=%d\nH,x,y);

x++;

。空=e+2*dy;

??if(e>0)

ft{

y++;

e=c-2*dx;

)

。}

)

////////////////////////umu/////////////////HUHH///////////

//Bresenham算法畫圓

〃參數(shù)說明:x,y圓心坐標〃

//R圓半徑〃

//num掃描轉換時從起點開始輸出的點的數(shù)目,用于動畫〃

///////////////////////////////////////////////////////////////////

voidBresenhamCircle(GLsizeix,GLsizeiy,GLsizeiR,GLsizeinum)

(

oglColor3f(1.0f,0.0f,O.Of);

?if(num==1)

oprintf(”Bresenham算法畫圓:各點坐標及判別式的值\n”);

“ntd,k=0,xa,ya;

?xa=0;ya=R;d=1-R;

while(xa<=ya){

putpixel(xa+x,ya+y);

gpulpixel(ya+x,xa+y);

。putpixe1(-ya+x,xa+y);

gputpixel(-xa+x,ya+y);

gputpixe1(-xa+x,-ya+y);

。putpixeI(-ya+x,-xa+y);

。putpixel(ya+x,-xa+y);

wputpixe1(xa+x,-ya+y);

if(k>=num-1){

qprintf("x=%d,y=%d\n",xa+x,ya+y);

?break;

1

k++;

if(d<0)d+=2*xa+3;

??else(

。。d+=2*(xa-ya)+5;

0ya-;

)

0xa++;

a)&

)

//初始化窗口

voidInitial(void)

(

//設立窗口顏色為藍色

glClearColor(l.Of,l.Of,1.Of,l.Of);

)

//窗口大小改變時調(diào)用的登記函數(shù)

voidChangeSize(GLsizeiw,GLsizeih)

(

&if(h==0)。。h=1;

。//設立視區(qū)尺寸

g1Viewport(0,0,w,h);

。//重置坐標系統(tǒng)

0glMatrixMode(GL_PROJECTION);

glLoadldentity();

//建立修剪空間的范圍

if(w<=h)

glOrtho(O.Of,250.0f,0.0f,250.0f*h/w,1.0,-1.0);

eIse

g1Ortho(0.0f,250.0f*w/h,O.Of,250.0f,1.0,-1.0):

}

//在窗口中繪制圖形

voidReDraw(void)

{

//用當前背景色填充窗口

glClear(GL_COLOR_BUFFER_BIT);

〃畫出坐標線

?DrawCordinateLine();

switch(m—DrawMode)

U

case1:

。DDACreateLine(0,0,20,15,m_Poin(Number);

break;

?case2:

?BresenhamLine(0,0,20,15,m_PointNumber);

??break;

case3:

oBresenham2Line(1,1,8,

溫馨提示

  • 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

提交評論