




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗報告計算機圖形學實驗大作業課程名稱計算機圖形學實驗名稱二維繪圖系統與計算機動畫姓名學號專業班級成績指導教師爨瑩實驗報告課程名稱計算機圖形學實驗名稱二維繪圖系統姓名學號專業班級實驗日期2015年12月8日 成績指導教師爨瑩一、實驗目的本實驗為設計和開發一個小型的二維繪圖系統。通過圖形軟件的設計開發和上機實驗,鞏固所學圖形學基本知識,掌握交互式圖形系統的設計方法,熟悉并掌握有關圖形圖象編程語言、工具和類庫的使用。二、實驗環境Win 8 操作系統 + VC 6.0開發平臺三、實驗內容與步驟1、算法原理( 1) DDA算法畫直線原理DDA算法是根據直線的微分方程來計算x 或y 生成直線的掃描轉換算
2、法。在一個坐標軸上以單位間隔對線段取樣,以決定另一個坐標軸方向上最靠近理想線段的整數值。設 ( x0, y0)為直線段的始點 , (x1,y1) 為直線段的終點 ,且端點坐標均為整數,則直線的微分方程為y1y0ykx1x0x設 | k| 1,則有yi+1=+1+= (xi+x)+ =+k xkxib kb yi上式表明 ,若x=1,則當 x 每遞增 1時,y 遞增 k。掃描轉換開始時, 取直線始點 ( x0,y0) 作為初始坐標。( 2)中點 Bresenham 算法畫直線原理Bresenham 畫線算法與中點畫線法有相似之處,也是通過在每列像素中確定與理想直線最近的像素來進行直線的掃描轉換的
3、。為了討論的方便, 不妨也假定直線的斜率在 0 1 之間。如圖所示 ,過各行、各列像素中心構造一組虛擬網格線,按直線從起點到終點的順序計算直線與各垂直網格線的交點,然后確定該列像素中與該交點最近的像素。Bresenham算法誤差項d 的幾何意義( 3)中點 Bresenham 算法畫圓算法原理為了討論的方便, 我們考慮中心在原點 2 2,半徑為R 的圓的第二個八分圓弧,圓的其它部分可通過一系列的簡單的反射變換得。也就是討論如何從(0,R) 到(R/ ,R/ ) 順時針確定最佳逼近于該圓弧的像素序列。中心在原點 ,半徑為R的圓的方程為x2+ 2=2yR若令 (,y)=x2+2-2,則上述方程為F
4、(x,y)=0F xyR如圖所示 , 假定x坐標為xP的像素中最佳逼近理想圓弧的為(P,yP),那么 ,P x下一個像素只能是正右方的P1( xP+1, yP) 或右下方的P2( xP+1, yP-1) 兩者之一。 引入 P1 和 P2 的中點 M( xP+1, yP-0.5),當 M在圓內時 ,應取P1( xP+1, yP) 為下一個像素 ,否則 , 應取 P( x +1,y -1) 為下一個像素。為此 ,構造判別式2PPd=F( M)= F( xP+1,yP-0.5)=( xP+1) 2+( yP-0.5) 2- R2中點畫圓法若 d<0, 則應取 P1( xP+1, yP) 為下一
5、個像素 , 而且再下一個像素的判別式為 d=F( xP+2, yP-0.5)=( xP+2) 2+( yP-0.5) 2- R2=d+2xP+3而 d0, 則應取 P2( xP+1, yP-1) 為下一個像素 , 而且再下一個像素的判別式為d=F( xP+2, yP-1.5)=(xP+2) 2+( yP-1.5) 2- R2 = d+2( xP- yP)+5由于第一個像素是(0, ),因而d的初始值為Rd0=F(1,R-0.5)=1.25-R( 4)中點 bresenham 算法畫橢圓原理中點畫圓法可以推廣到一般二次曲線的生成,下面以中心在原點的標準橢圓的掃描轉換為例說明。設橢圓的方程為F(
6、x, y)= b2x2+a2y2- a2b2=0其中 , a 為沿 x 軸方向的長半軸長度 , b 為 y 軸方向的短半軸長度 , 整數。 不失一般性 , 我們只討論第一象限橢圓弧的生成。需要注意的是理這段橢圓時 , 必須以弧上斜率為 -1 的點 ( 即法向量兩個分量相等的點界把它分為上部分和下部分 , 如圖所示。a、 b 均為,在處) 作為分第一象限的橢圓弧該橢圓上一點( x,y) 處的法向量為N ( x, y)FiFj2b2 xi2a 2 yixy其中 ,i和 j分別為沿x 軸和y 軸方向的單位向量。從圖3.6可看出,在上部分 ,法向量的y 分量更大,而在下部分,法向量的x 分量更大,因而
7、 ,在上部分若當前最佳逼近理想橢圓弧的像素( xP, yP) 滿足下列不等式b2( xP+1) a2( yP-0.5)而確定的下一個像素不滿足上述不等式,則表明橢圓弧從上部分轉入下部分。在上部分 ,假設橫坐標為xP的像素中與橢圓弧更接近點是( xP,yP),那么下一對候選像素的中點是( xP+1,yP-0.5) 。 因此判別式為d1=F( xP+1, yP-0.5)= b2( xP+1) 2+a2( yP-0.5) 2- a2b2若 d1<0,中點在橢圓內 ,則應取正右方像素,且判別式應更新為d1= (P+2,yP-0.5)=2(xP+2)2+2(yP-0.5)2-22= 1+ 2(2x
8、P+3)F xbaa b d b當 d10, 中點在橢圓之外,這時應取右下方像素, 并且更新判別式為PyP2P2+a2P222P2Pd 1=F( x +2,-1.5)=b ( x+2)( y-1.5)- a b=d1+b2(2 x+3)+ a (-2 y+2)由于弧起點為 (0,b),因此 ,第一中點是 (1,b-0.5),對應的判別式是d10=F(1, b-0.5)=b2+a2( b-0.5)2- a2b2 = b2+a2(- b+0.25)在下部分 ,應改為從正下方和右下方兩個像素中選擇下一像素。如果在上部分所選擇的最后一像素是 ( xP,yP),則下部分的中點判別式d2 的初始值為d20
9、=F( xP+0.5,yP-1)= b2( xP+0.5) 2+a2( yP-1)2- a2b2d2 在正下方向與右下方向的增量計算與上部分類似,這里不再贅述。下部分弧的終止條件是y=0。( 5)三次 Bezier曲線算法的原理Bézier 曲線是法國雷諾汽車公司的工程師PierreBézier 于 1962 年提出的 ,它將函數逼近同幾何表示結合起來,目的在于使設計師在計算機上能得心應手地繪圖。Bézier 曲線在各種CAD系統中有廣泛的應用。假設給出n+1 個控制點的位置矢量Pi ( i =0, 1, 2,n),則 n 次 Bézier 多項n式函數
10、為C (u)Pi Bi ,n (u)0u1i0由控制點Pi ( i =0, 1, 2,n) 中相鄰兩點的連線構成的折線集稱為Bézier 特征多邊形。Bézier 曲線的形狀逼近于特征多邊形的形狀,起點和終點與多邊形的起點、終點重合,且多邊形的第一條邊和最后一條邊表示了曲線在起點和終點處的切矢量方向。Bi,n(t)是 Bernstein基函數 ,也是 Bézier 曲線的調和函數。 Bézier 曲線的性質由它的調和函數所決定。Bi, n (t)Cnit i (1t) n in!ti (1 t) n ii !(n i)!i 0,1,2, n如圖 7 所示
11、的是一條三次Bézier 曲線。P1P2P0圖 8 三次 Bézier 曲線P3三次 Bézier 曲線算法實現公式:3t )3 P03t ( 1 t ) 2 P13t 2( 1 t )P2 t 3P3C(t )Pi Bi ,3(t )(1i0(6 )三次 B 樣條曲線算法原理已知 n+1 個控制點 Pi ( i =0, 1,n), 則 k 次 ( k+1 階 )B 樣條曲線的表達式是其中 , Ni , k(u) 是調和函數 ,也稱之為基函數 ,由 Schoenberg提出, 其遞歸定義為nC(u)Pi Ni ,k(u)i 0Ni ,01 ti u ti 1(u)
12、0(u ti )Ni, k(u)(ti k 1 u)Ni 1,k 1(u)Ni ,k (u)ti k 1 ti 1ti k ti( tk u tn +1)( 7)基本圖形變換原理基本圖形變換即是對一個基本圖形進行各種平移,旋轉,剪切,對稱,比例等各項基本操作,其本質便是將一個基本圖形的坐標寫成其次坐標的形式,齊次坐標表示法就是用N+1維向量來表示一個 N 維向量。在齊次坐標系統中,點 (X,Y) 用 (X,Y,H) 來表達,其中 H 為非零的一個任意數。 點 (X,Y) 的標準齊次坐標表達為 (X/H,Y/H,1) ,由于 H 是一個任意非零常量,為了簡便起見,我們通常取H=1。齊次坐標系統中
13、的點(X,Y,1)包含有笛卡爾坐標上的點(X,Y) 。對其進行各種變換即是在本身齊次坐標的矩陣上進行矩陣乘運算,使其產生不同的變換效果例如:平移變換的矩陣乘法如下100x y 1 = xy1010=x+Tx y+Ty 1TxTy1比例變換的矩陣乘法如下Sx00x y 1 = xy1 0 Sy 0=xSx ySy 10012、代碼編程:(1) 直線1>DDA直線int x0=10,y0=150,x1=150,y1=100;int x,y;float dx,dy,k;dx=(float)(x1-x0);dy=(float)(y1-y0);k=dy/dx;y=y0;if(abs(k)<1
14、)for(x=x0;x<=x1;x+)pDC->SetPixel(x,int(y+0.5),RGB(255,0,0);y=y+k;if(abs(k)>=1)for(y=y0;y<y1;y+)pDC->SetPixel(int(x+0.5),y,RGB(0,0,288);x = x + 1/k;ReleaseDC(pDC)2>中點 Bresenham 算法直線CDC* pDC=GetDC();int x1=10, y1=20, x2=550, y2=400,c=RGB(255,0,0);int i,s1,s2,interchange;float x,y,del
15、tax,deltay,f,temp;x=x1;y=y1;deltax=abs(x2-x1);deltay=abs(y2-y1);if(x2-x1>=0) s1=1; else s1=-1;if(y2-y1>=0) s2=1; else s2=-1;if(deltay>deltax)temp=deltax;deltax=deltay;deltay=temp;interchange=1;else interchange=0;f=2*deltay-deltax;pDC->SetPixel(x,y,c);for(i=1;i<=deltax;i+)if(f>=0)if
16、(interchange=1) x+=s1;else y+=s2;pDC->SetPixel(x,y,c);f=f-2*deltax;elseif(interchange=1) y+=s2;else x+=s1;f=f+2*deltay;(2)畫圓1>中點 Bresenham 算法畫圓CDC* pDC=GetDC();int xc=200, yc=110, radius=100, c=0;int x=0,y=radius,p=3-2*radius;while(x<y)pDC->SetPixel(xc+x, yc+y, c);pDC->SetPixel(xc-x,
17、yc+y, c);pDC->SetPixel(xc+x, yc-y, c);pDC->SetPixel(xc-x, yc-y, c);pDC->SetPixel(xc+y, yc+x, c);pDC->SetPixel(xc-y, yc+x, c);pDC->SetPixel(xc+y, yc-x, c);pDC->SetPixel(xc-y, yc-x, c);if (p<0)p=p+4*x+6;elsep=p+4*(x-y)+10;y-=1;x+=1;if(x=y)pDC->SetPixel(xc+x, yc+y, c);pDC->Se
18、tPixel(xc-x, yc+y, c);pDC->SetPixel(xc+x, yc-y, c);pDC->SetPixel(xc-x, yc-y, c);pDC->SetPixel(xc+y, yc+x, c);pDC->SetPixel(xc-y, yc+x, c);pDC->SetPixel(xc+y, yc-x, c);pDC->SetPixel(xc-y, yc-x, c);2>系統畫圓pDC->SetViewportOrg(230,110) ;pDC->Ellipse(-90,90,90,-90) ;break;(3)畫橢圓
19、1>中點 Bresenham 算法畫橢圓CDC* pDC=GetDC();int a=200,b=100,xc=700,yc=110,c=0;int x,y;double d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);pDC->SetPixel(x+300,y+200,c);pDC->SetPixel(-x+300,y+200,c);pDC->SetPixel(x+300,-y+200,c);pDC->SetPixel(-x+300,-y+200,c);while(b*b*(x+1)<a*a*(y-0.5)if(d1<0)d1+
20、=b*b*(2*x+3);x+;elsed1+=b*b*(2*x+3)+a*a*(-2*y+2);x+;y-;pDC->SetPixel(x+xc,y+yc,c);pDC->SetPixel(-x+xc,y+yc,c);pDC->SetPixel(x+xc,-y+yc,c);pDC->SetPixel(-x+xc,-y+yc,c);d2=sqrt(b*(x+0.5)+a*(y-1)-a*b;while(y>0)if(d2<0)d2+=b*b*(2*x+2)+a*a*(-2*y+3);x+;y-;elsed2+=a*a*(-2*y+3);y-;pDC->
21、SetPixel(x+xc,y+yc,c);pDC->SetPixel(-x+xc,y+yc,c);pDC->SetPixel(x+xc,-y+yc,c);pDC->SetPixel(-x+xc,-y+yc,c);2>系統畫橢圓pDC->SetViewportOrg(600,190);pDC->Ellipse(0,0,200,150);break;( 4)圖形基本變換1> 母圖float a43=-100,-100,1,-20,100,1,170,0,1,100,-120,1;int i;pDC->MoveTo(int(a30),int(a31);for(i=0;i<4;i+)pDC->LineTo(int(ai0),int(ai1);2>基本變換以平移為例:float a43=-100,-100,1,-20,100,1,170,0,1,100,-120,1;float b 3=1,0,0,0,1,0,-100,-100,1;float c43;int i;pDC->MoveTo(int(a30),int(a31);for(i=0;i<4;i+)pDC-&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025商業店鋪買賣合同范本 商業店鋪買賣合同
- 購房定購終止協議書
- 種植合作框架協議書
- 2025江西省綠茶訂購合同范本
- 工地班車出租合同協議
- 物流勞動安全協議書
- 嚴禁私自飲酒協議書
- 木材損壞賠償協議書
- 當鋪生意轉讓協議書
- 造價公司團隊管理制度
- 大學語文《西廂記》PPT課件
- 《中華經典誦讀》PPT課件
- 礦山承包開采合同
- ZL40輪式裝載機工作裝置設計(含全套CAD圖紙)
- 電力行業信息系統安全等級保護定級工作指導意見
- 履帶底盤的組成介紹及各參數的計算
- 砼檢查井自動計算表格Excel
- 資產評估收費管理辦法中評協[2009]199號
- 某化纖毛紡廠總配變電所與高壓配電系統設計說明
- 風險等級劃分方法(矩陣法)
- 聯軸器找中心PPT課件
評論
0/150
提交評論