計(jì)算機(jī)圖形圖像技術(shù)-實(shí)驗(yàn)報(bào)告參考形式_第1頁(yè)
計(jì)算機(jī)圖形圖像技術(shù)-實(shí)驗(yàn)報(bào)告參考形式_第2頁(yè)
計(jì)算機(jī)圖形圖像技術(shù)-實(shí)驗(yàn)報(bào)告參考形式_第3頁(yè)
計(jì)算機(jī)圖形圖像技術(shù)-實(shí)驗(yàn)報(bào)告參考形式_第4頁(yè)
計(jì)算機(jī)圖形圖像技術(shù)-實(shí)驗(yàn)報(bào)告參考形式_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)驗(yàn)二 直線的生成算法的實(shí)現(xiàn)一、實(shí)驗(yàn)?zāi)康暮鸵螅?、理解直線生成的基本原理2、熟悉直線的生成算法,掌握直線的繪制3、利用TurboC實(shí)現(xiàn)直線生成的DDA 中點(diǎn)畫(huà)法二、實(shí)驗(yàn)內(nèi)容:1、了解直線生成的原理.直線DDA算法 對(duì)于端點(diǎn)(x0,y0)和(x1,y1)的直線段,直線掃描轉(zhuǎn)換的最簡(jiǎn)單方法是先算出直線的斜率,然后,從直線的起點(diǎn)開(kāi)始,確定逼近與直線的y軸坐標(biāo)。 假設(shè)端點(diǎn)坐標(biāo)均為整數(shù),表示端點(diǎn)恰在柵格上,讓x從起點(diǎn)變化到終點(diǎn),每步遞增x,利用直線方程y= kx+ b可以計(jì)算出對(duì)應(yīng)的y軸坐標(biāo) yi+1= kxi+1+ b = k(xi+x)+ b = kxi+ b+ kx (3.1) = yi+ kx

2、取x=1時(shí),有yi+1= yi+ k,即當(dāng)x每遞增1時(shí),y遞增的值是直線斜率k。直線DDA算法就是取直線起點(diǎn)(x0,y0)作為初始坐標(biāo),每一步x遞增1,通過(guò)式(3.1)計(jì)算出y軸坐標(biāo)。直線DDA算法也稱(chēng)數(shù)值微分算法。.中點(diǎn)畫(huà)線算法 和直線DDA算法的討論相同,在對(duì)中點(diǎn)畫(huà)線算法的討論中,假定直線斜率|k|1。這種情況下,x每增加1,y最多增加1.假設(shè)x軸坐標(biāo)為xi的與直線最近的像素已經(jīng)決定為P(xi,yi),則下一個(gè)與直線最接近的像素只能是正右方的P1(xi+1,yi)或右上方的P2(xi+1,yi+1)。以M(xi+1,yi+0.5)表示P1 與P2的中點(diǎn),用Q表示該直線與x= xi+1直線的

3、交點(diǎn)。很明顯,當(dāng)M在Q的下方,表明P2離直線更近,應(yīng)該取P2為下一直線上的點(diǎn);當(dāng)M在Q的上方,表明P1離直線更近,應(yīng)該取P1為下一直線上的點(diǎn),如果M與Q重合,可以任取P1 P2中的一點(diǎn)。這就是中點(diǎn)畫(huà)線算法的基本思想。中點(diǎn)畫(huà)線算法的實(shí)現(xiàn),關(guān)鍵是建立判別式判斷M與Q的位置關(guān)系,以及如何合理方便地利用增量算法計(jì)算判別式。假設(shè)直線的起點(diǎn)和終點(diǎn)分別是(x0,y0)和(x1,y1),如果直線方程采用隱式方程表示為F(x,y)=ax+by+c=0 (3.2)通過(guò)簡(jiǎn)單計(jì)算,可得式(3.2)中的a、b、c分別為a= y0y1b= x1 x0c= x0 y1 x1 y0由于假定直線斜率|k|1,且x0x1,所以a

4、0。依據(jù)直線的基本常識(shí),如果一個(gè)點(diǎn)(x,y)在直線的上面,有F(x,y)0;如果一個(gè)點(diǎn)(x,y) 在直線的下面,有F(x,y) 0;如果一個(gè)點(diǎn)(x,y)在直線上,有F(x,y)= 0;因此,欲判斷前述Q在M的上方還是下方,只要把M代入直線方程是構(gòu)造的判別式(3.2)并判斷它的符號(hào),即 di= F(Mi)= F(xi+1,yi+0.5) = a(xi+1)+b( yi+0.5)+c (3.2)當(dāng)d0時(shí),M在直線的下方,應(yīng)取右上方的P2作為下一個(gè)像素;當(dāng)d0時(shí),M在直線的上方,應(yīng)取正右上方的P1作為下一個(gè)像素;當(dāng)d=0時(shí),可以隨便取一個(gè),約定取正右方的P1。為了簡(jiǎn)化判別式的計(jì)算,注意到di是xi和

5、yi的線性函數(shù),可以采用增量算法。當(dāng)d0時(shí),取正右方像素P1,令再下一個(gè)像素的判別式為 di+1= F(xi+2,yi+0.5) = a(xi+2)+b( yi+0.5)+c = a(xi+1)+b( yi+0.5)+c+ a = di+ a此時(shí)表示判別式的增量為a。當(dāng)d0,取右上方的P2作為下一個(gè)像素,令再下一個(gè)像素的判別式為 di+1= F(xi+2,yi+1.5) = a(xi+2)+b( yi+1.5)+c = a(xi+1)+b( yi+0.5)+c+ a+ b = di+ a+ b此時(shí)表示判別式的增量為a+ b。直線的最左端是端點(diǎn)(x0,y0),已知F(x0,y0)=0,所以d的初

6、始值計(jì)算是 d0= F(x0+1,y0+0.5) = a(x0+1)+b( y0+0.5)+c = a+ 0.5b由于在實(shí)際使用中只關(guān)心d的符號(hào),且a、b都是整數(shù),因此可在算法實(shí)現(xiàn)中以2d的正負(fù)代替d的正負(fù),這樣可以簡(jiǎn)化掉d的初始值中的小數(shù),寫(xiě)出僅包含整數(shù)運(yùn)算的算法。 2、編程實(shí)現(xiàn)DDA算法、中點(diǎn)畫(huà)法繪制直線段三、實(shí)驗(yàn)結(jié)果分析/ 程序名稱(chēng):基于 DDA 算法畫(huà)任意斜率的直線#include <graphics.h>#include <conio.h>/ 四舍五入int Round(float x)return (int)(x < 0 ? x - 0.5 : x +

7、 0.5);/ 使用 DDA 算法畫(huà)任意斜率的直線(包括起始點(diǎn),不包括終止點(diǎn))void Line_DDA(int x1, int y1, int x2, int y2, int color)float x, y;/ 當(dāng)前坐標(biāo)點(diǎn)float cx, cy;/ x、y 方向上的增量int steps = abs(x2 - x1) > abs(y2 - y1) ? abs(x2 - x1) : abs(y2 - y1);x = (float)x1;y = (float)y1;cx = (float)(x2 - x1) / steps;cy = (float)(y2 - y1) / steps;f

8、or(int i = 0; i < steps; i+)putpixel(Round(x), Round(y), color);/ 在坐標(biāo) (x, y) 處畫(huà)一個(gè) color 顏色的點(diǎn)x += cx;y += cy;/ 主函數(shù)void main()initgraph(640, 480);/ 測(cè)試畫(huà)線Line_DDA(100, 1, 1, 478, RED);Line_DDA(1, 478, 638, 1, RED);/ 按任意鍵退出getch();closegraph();/ 程序名稱(chēng):基于中點(diǎn)算法畫(huà)任意斜率的直線#include <graphics.h>#include &

9、lt;conio.h>/ 使用中點(diǎn)算法畫(huà)任意斜率的直線(包括起始點(diǎn),不包括終止點(diǎn))void Line_Midpoint(int x1, int y1, int x2, int y2, int color)int x = x1, y = y1;int a = y1 - y2, b = x2 - x1;int cx = (b >= 0 ? 1 : (b = -b, -1);int cy = (a <= 0 ? 1 : (a = -a, -1);putpixel(x, y, color);int d, d1, d2;if (-a <= b)/ 斜率絕對(duì)值 <= 1d = 2 * a + b;d1 = 2 * a;d2 = 2 * (a + b);while(x != x2)if (d < 0)y += cy, d += d2;elsed += d1;x += cx;putpixel(x, y, color);else/ 斜率絕對(duì)值 > 1d = 2 * b + a; d1 = 2 * b;d2 = 2 * (a + b);while(y != y2) if(d < 0)d += d1; else x += cx, d += d2; y += cy; putpixel(x, y, color); / 主函數(shù)v

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論