印刷圖像及圖形處理實(shí)驗(yàn)參考生成_第1頁
印刷圖像及圖形處理實(shí)驗(yàn)參考生成_第2頁
印刷圖像及圖形處理實(shí)驗(yàn)參考生成_第3頁
印刷圖像及圖形處理實(shí)驗(yàn)參考生成_第4頁
印刷圖像及圖形處理實(shí)驗(yàn)參考生成_第5頁
已閱讀5頁,還剩127頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

印刷圖像及圖形處理PrintingImageandGraphProcessing主講:鐘云飛第三章圖形處理的基本理論3.1二維輸出圖元及其屬性3.2多邊形的掃描轉(zhuǎn)換及區(qū)域填充(X)3.3幾何變換3.4曲線曲面造型知識點(diǎn):熟悉掌握計(jì)算機(jī)圖形學(xué)的基本概念,計(jì)算機(jī)圖形算法基礎(chǔ)知識,了解圖形變換基礎(chǔ)類型,了解計(jì)算機(jī)對曲線與曲面處理的工作原理。重點(diǎn):計(jì)算機(jī)圖形學(xué)的基本概念。難點(diǎn):計(jì)算機(jī)圖形算法。

3.1二維輸出圖元及其屬性如何在指定的輸出設(shè)備上根據(jù)坐標(biāo)描述構(gòu)造基本二維幾何圖形(點(diǎn)、直線、圓、橢圓、多邊形域、像素?cái)?shù)組、字符串及其相關(guān)屬性等)提出問題直線生成算法圓弧生成算法橢圓生成算法其它輸出圖元的生成輸出圖元的屬性字符的生成本章內(nèi)容主要內(nèi)容學(xué)習(xí)目標(biāo)深入認(rèn)識圖形函數(shù)包功能,了解函數(shù)是如何實(shí)現(xiàn)的,從而可改進(jìn)圖形函數(shù)以適應(yīng)某些特殊的應(yīng)用需求。開發(fā)和改進(jìn)圖形技術(shù),發(fā)展網(wǎng)絡(luò)圖形應(yīng)用,開發(fā)更快的實(shí)時(shí)性更強(qiáng)的圖形顯示。掌握直線、圓、橢圓的生成算法熟悉輸出圖元的屬性控制、字符的生成學(xué)習(xí)目標(biāo)圖形設(shè)計(jì)中最基本的圖形元素是點(diǎn)、直線、圓、曲線。任何復(fù)雜的圖形均可看成是點(diǎn)和直線組成。本質(zhì)上,物體的形狀和顏色可用像素矩陣或直線段和多邊形填充區(qū)域等基本幾何結(jié)構(gòu)來描述。通常,圖形編程軟件包提供使用輸出圖元的基本幾何結(jié)構(gòu)來描述場景和將輸出圖元組合成更復(fù)雜結(jié)構(gòu)的功能。點(diǎn)和直線段是最簡單的幾何成分。一、點(diǎn)和直線在CRT上,點(diǎn)的顯示是通過開關(guān)電子槍,使電子束打擊在屏幕上的某一位置發(fā)光。電子束的定位取決于采用的顯示技術(shù)。

a.在向量顯示系統(tǒng)中,畫點(diǎn)命令存放在顯示列表中,而坐標(biāo)位置被轉(zhuǎn)換為偏轉(zhuǎn)線圈上的電壓以使電子束定位在指定的屏幕位置上。

b.在黑白光柵顯示系統(tǒng)中,通過設(shè)置幀緩沖區(qū)中對應(yīng)屏幕位置的位的值為1來顯示點(diǎn),這樣,當(dāng)電子束掃描過水平掃描線時(shí),如遇到幀緩沖區(qū)中值為1時(shí),就發(fā)射電子打擊屏幕,產(chǎn)生亮點(diǎn)。對于RGB系統(tǒng),顏色碼隨幀緩存加載,以便能顯示彩色點(diǎn)。畫直線通過計(jì)算兩端點(diǎn)間的中間點(diǎn)來畫直線。像向量筆、向量顯示器這樣的模擬輸出設(shè)備能輸出光滑的直線。數(shù)字設(shè)備畫直線是通過畫直線兩個(gè)端點(diǎn)間的各個(gè)離散的點(diǎn)來完成。每個(gè)分散的點(diǎn)的位置通過直線方程來計(jì)算。對于光柵顯示系統(tǒng),直線顏色裝載在相應(yīng)象素位置的幀緩存中。屏幕坐標(biāo)只能為整數(shù),因此,畫點(diǎn)的位置只能近似實(shí)際直線上點(diǎn)的位置。例如計(jì)算的點(diǎn)的位置(10.48,20.51)近似為(10,21)。這樣畫出的直線會出現(xiàn)鋸齒樣,在低分辨率的顯示系統(tǒng)上尤其明顯。通過調(diào)整顯示點(diǎn)的亮度可以減輕鋸齒影響,無法消除。點(diǎn)的坐標(biāo) 點(diǎn)在屏幕上的位置坐標(biāo)用像素為單位,點(diǎn)的像素坐標(biāo)只能是整數(shù)。 而理論上的點(diǎn)的坐標(biāo)根據(jù)直線方程可以為任何實(shí)數(shù),而點(diǎn)的像素坐標(biāo)受設(shè)備坐標(biāo)系的制約,只能為整數(shù)。本章將討論光柵系統(tǒng)上設(shè)備級圖元生成算法,物體坐標(biāo)用整數(shù)的設(shè)備坐標(biāo)指定。目前我們假定象素位置根據(jù)水平掃描線和垂直掃描線的交叉定義,如圖。裝載指定位置象素的顏色到幀緩存用函數(shù):setPixel(x,y)或setPixel(x,y,color)讀取指定位置象素的顏色用函數(shù):

getPixel(x,y)0123453210光柵掃描轉(zhuǎn)換的定義 根據(jù)圖形的幾何描述,確定在二維的像素矩陣上那些像素正好在圖形上或最靠近圖形,這一過程就稱為光柵掃描轉(zhuǎn)換。評價(jià)光柵掃描轉(zhuǎn)換算法優(yōu)劣的標(biāo)準(zhǔn)a.顯示圖形的精度。b.算法的時(shí)間復(fù)雜性。c.算法的空間復(fù)雜性。二、直線生成算法計(jì)算機(jī)繪制的直線是由一系列與該直線最近的像素繪制而成,因此,理論直線與計(jì)算機(jī)繪制的直線之間總有一定的偏差,由繪圖的方式?jīng)Q定,只能盡量減少偏差。偏差取決于屏幕光柵(分辨率)和光點(diǎn)的運(yùn)動(dòng)方向。直線的笛卡爾斜率截距方程:

y=mx+b (3-1)

給定直線的兩個(gè)端點(diǎn)(xa,ya)和(xb,yb),則可計(jì)算出:

m=(yb-ya)/(xb-xa)(3-2) b=(yaxb-ybxa)/(xb-xa) (3-3)

對于任何沿直線給定的x方向上的增量△x,可從方程(3-2)計(jì)算出對應(yīng)的y方向上的增量△y: △y=m△x(3-4)

同樣,可以得出對應(yīng)于指定y方向上的增量△y,可從方程(3-2)計(jì)算出對應(yīng)的x向上的增量△x △x=△y/m(3-5)對于模擬顯示設(shè)備,方程(3-4)(3-5)使決定偏轉(zhuǎn)電壓變化的基礎(chǔ)。

a.當(dāng)|m|<1,△x可以設(shè)置為正比于一水平偏轉(zhuǎn)電壓,△y則可以根據(jù)公式計(jì)算。

b.當(dāng)|m|>1,△y可以設(shè)置為正比于一水平偏轉(zhuǎn)電壓,△x則可以根據(jù)公式計(jì)算。對于光柵顯示器,直線用象素點(diǎn)來畫,在水平或垂直上的步長△x/△y受象素間距限制。即需要在直線上不同的位置取樣,并在每個(gè)樣本點(diǎn)上取最接近直線的點(diǎn)。如圖:xaxb二、常用直線生成算法.1.1DDA算法.1.2Bresenham直線算法.1.3中點(diǎn)直線算法.1.4并行直線算法DDA(digitaldifferentialanalyzer)方法是利用方程(3-4)或(3-5)計(jì)算△x或△y的一個(gè)線段掃描轉(zhuǎn)換算法。在一個(gè)坐標(biāo)軸上以單位間隔取樣,以決定另一個(gè)坐標(biāo)軸上最靠近線段路徑的對應(yīng)整數(shù)值。對于0≤m≤1,則在單位x間隔(△x=1)取樣并計(jì)算每個(gè)順序的y值:

yk+1=yk+m(3-6) 下標(biāo)k取整數(shù),從起點(diǎn)開始遞增至末點(diǎn)。由于m可是0到1之間的任意實(shí)數(shù),所以計(jì)算出的y值必須取整。.1.1DDA算法對于1≤m的直線段,則將x和y的規(guī)則交換,即在單位y間隔(△y=1)取樣,并計(jì)算每個(gè)連續(xù)的x值:

xk+1=xk+1/m(3-7)方程(3-6)和(3-7)基于線段從左端點(diǎn)到右端點(diǎn)進(jìn)行處理的假設(shè)。假設(shè)這個(gè)過程相反,即起始點(diǎn)在右側(cè),那么,△x=-1,并且

yk+1=yk-m(3-8) 或△y=-1,且

xk+1=xk-1/m(3-9) 方程(3-6)至(3-9)也可用于計(jì)算負(fù)斜率的線段的像素位置。一般地: 畫直線的DDA算法可表示為:若|m|≤1:xk+1=xk+1,yk+1=yk+m;xa<xb or:xk+1=xk-1,yk+1=yk-m ;xa>xb若|m|≥1:yk+1=yk+1,xk+1=xk+1/m;ya<yb or:yk+1=yk-1,yk+1=yk-1/m;ya>ybDDA算法的C實(shí)現(xiàn)#defineRound(a)((int)(a+0.5))voidlineDDA(intxa,intya,intxb,intyb){intdx=xb-xa,dy=yb-ya,steps,k;floatxIncrement,yIncrement,x=xa,y=ya;if(abs(dx)>abs(dy)) steps=abs(dx);else steps=abs(dy);

xIncrement=dx/(float)steps;yIncrement=dy/(float)steps;setpixel(Round(x),Round(y),RED);for(k=0;k<steps;k++){x+=xIncrement;y+=yIncrement;setpixel(Round(x),Round(y),RED);}}分析從(0,0)到(20,10)的直線段和從(20,10)到(0,0)的直線DDA算法的缺點(diǎn):a.計(jì)算量大(取整操作和浮點(diǎn)運(yùn)算)b.效率低,速度慢

c.誤差累計(jì),造成畫長直線時(shí)點(diǎn)逐漸偏離理論點(diǎn).1.2Bresenham直線算法它是由Bresenham提出的一種精確而有效的光柵線段生成算法,可用于直線、圓(圓弧)和其它曲線的生成??紤]直線斜率0≤m≤1,且xa<xb,根據(jù)DDA算法,則: xk+1=xk+1 yk+1=yk+m(xk,yk)是第k步計(jì)算出的點(diǎn)的坐標(biāo),它在x=xk處最接近/通過直線。那么下一點(diǎn)需要確定在xk+1處繪制哪個(gè)像素,是(xk+1,yk)還是(xk+1,yk+1)?其位置如圖:XkYkXk+1Yk+1ABC由DDA算法知道,當(dāng)xk+1=xk+1時(shí),yk+1=yk+m后取整,有兩種情況yk+1=yk和yk+1=yk+1,即B(xk+1,yk)和A(xk+1,yk+1)兩個(gè)點(diǎn).對于Bresenham算法,根據(jù)直線y=mx+b在x=xk+1處的理論坐標(biāo)點(diǎn)與點(diǎn)A、B間的距離大小關(guān)系,選擇距離小的點(diǎn)。設(shè)定d1=|BC|,d2=|AC|,由直線方程y=mx+b,在x=xk+1的y坐標(biāo)

y=m(xk+1)+b則:

d1=y-yk=m(xk+1)+b-yk d2=yk+1-y=yk+1-m(xk+1)-b △d=d1-d2=2m(xk+1)-2yk+2b-1根據(jù)△d的符號可判斷在x=xk+1應(yīng)該取理論坐標(biāo)的上下中的那一個(gè)點(diǎn),判定方法:

A.△d>0,取上面的點(diǎn)A(yk+1=yk+1) B.△d≤0,取下面的點(diǎn)B(yk+1=yk)由于△d的計(jì)算量大,考慮到△x=xb-xa>0,△y=yb-ya因此做如下變化:

pk=△x△d=2△yxk-2△xyk+c,(c=2△y+△x(2b-1)為常數(shù))則:pk+1=2△yxk+1-2△xyk+1+cpk+1=pk+2△y-2△x(yk+1-yk)p0=2△y-△xBresenham的算法表示(適用于0≤m≤1且xa<xb):

p0=2△y-△x xk+1=xk+1 yk+1=yk+1,pk+1=pk+2(△y-△x)當(dāng)pk≥0 yk+1=yk,pk+1=pk+2△y當(dāng)pk<00≤m≤1,且xa<xb的Bresenham畫線算法步驟:1.輸入線的兩個(gè)端點(diǎn),左端點(diǎn)存儲在(x0,y0)中;2.將(x0,y0)裝入幀緩沖器,畫出第一個(gè)點(diǎn);3.計(jì)算常量△x,△y,2△y和2△y-2△x,并得到?jīng)Q策參數(shù)的第一個(gè)值:p0=2△y-△x4.從k=0開始,在沿線的每個(gè)xk處,進(jìn)行如下檢測: 假如pk<0,下一個(gè)待畫點(diǎn)是(xk+1,yk),且 pk+1=pk+2△y

否則,下一個(gè)待畫點(diǎn)是(xk+1,yk+1),且pk+1=pk+2(△y-△x)5.重復(fù)步驟4,共△x次。Bresenham算法的C實(shí)現(xiàn)(0<m<1且x0<x1)voidlineBres(intxa,intya,intxb,intyb){intdx=xb-xa,dy=yb-ya;intp=2*dy-dx;inttwoDy=2*dy,twoDyDx=2*(dy-dx);intx,y,xEnd;x=xa;y=ya;xEnd=xa;setpixel(x,y,RED);while(x<xEnd){x++;if(p<0)p+=twoDy;else{y++;p+=twoDyDx;}setpixel(x,y,RED);}}例:分析從(0,0)到(20,10)的直線段051015200510思考:請給出任意m且區(qū)分起始點(diǎn)的Bresenham直線算法表示或程序。(1)0<m<1,xa<xb(2)0<m<1,xa>xb(3)1<m,ya<yb(4)1<m,ya>yb(5)-1<m<0,xa<xb(6)-1<m<0,xa>xb(7)m<-1,ya<yb(8)m<-1,ya>ybBresenham的算法表示(適用于0≤m≤1且xa>xb):

p0=-2△y+△x xk+1=xk-1 yk+1=yk-1,pk+1=pk-2(△y-△x)當(dāng)pk≥0 yk+1=yk,pk+1=pk-2△y當(dāng)pk<0.1.3中點(diǎn)直線算法一種精確而有效的光柵線段生成算法,可用于直線、圓(圓弧)和其它曲線的生成??紤]直線斜率0≤m≤1,且xa<xb,根據(jù)DDA算法,則: xk+1=xk+1 yk+1=yk+m(xk,yk)是第k步計(jì)算出的點(diǎn)的坐標(biāo),它在x=xk處最接近/通過直線。那么下一點(diǎn)需要確定在xk+1處繪制哪個(gè)像素,是(xk+1,yk)還是(xk+1,yk+1)?其位置如圖:XkYkXk+1Yk+1ABC由DDA算法知道,當(dāng)xk+1=xk+1時(shí),yk+1=yk+m后取整,有兩種情況yk+1=yk和yk+1=yk+1,即B(xk+1,yk)和A(xk+1,yk+1)兩個(gè)點(diǎn).A,B的中點(diǎn)M(xk+1,yk+0.5),直線與x=xk+1的交點(diǎn)C(xk+1,mxk+1+b),如果YC>YM(C的縱坐標(biāo)較大),則C離A近,下一點(diǎn)取A,否則取B.判別式:點(diǎn)與直線的位置關(guān)系

F(x,y)=y-(mx+b)則

<0(x,y)位于直線下方F(x,y) =0(x,y)位于直線本身上

>0(x,y)位于直線上方所以:△d=-2F(M)=-2F(xk+1,yk+0.5)=2m(xk+1)-2yk+2b-1根據(jù)△d的符號可判斷在x=xk+1應(yīng)該取理論坐標(biāo)的上下中的那一個(gè)點(diǎn),判定方法:

A.△d>0,取上面的點(diǎn)A(yk+1=yk+1) B.△d≤0,取下面的點(diǎn)B(yk+1=yk)由于△d的計(jì)算量大,考慮到△x=xb-xa>0,△y=yb-ya因此做如下變化:pk=△x△d=2△yxk-2△xyk+c,(c=2△y+△x(2b-1)為常數(shù))則:pk+1=2△yxk+1-2△xyk+1+cpk+1=pk+2△y-2△x(yk+1-yk)同樣:

A.pk>0,取上面的點(diǎn)A(yk+1=yk+1) B.pk

≤0,取下面的點(diǎn)B(yk+1=yk)初始條件

p0=2△yxa-2△xya+2△y+△x(2b-1)=2△y-△x中點(diǎn)直線的算法表示(適用于0≤m≤1且xa<xb):

p0=2△y-△xxk+1=xk+1yk+1=yk+1,pk+1=pk+2(△y-△x)當(dāng)pk≥0yk+1=yk,pk+1=pk+2△y當(dāng)pk<0.1.4并行直線算法前面討論的直線生成算法順序地生成象素點(diǎn)。對于并行計(jì)算機(jī),可以將這樣的順序執(zhí)行任務(wù)在多個(gè)處理器間分配來實(shí)現(xiàn)直線的并行生成。假設(shè)有np個(gè)處理器,對于Bresenham直線算法,我們可將直線分成np段,然后在每個(gè)處理器上分別計(jì)算這些直線段。設(shè)直線斜率0<m<1,且左端點(diǎn)坐標(biāo)(xa,ya)。則兩個(gè)相鄰直線段的開始x坐標(biāo)的距離:

xp=

(x+np-1)/np整數(shù)除法

(3-15)直線段從0,1,2,…,np-1編號,第k段的起始x坐標(biāo):

xk=xa+kxp(3-16)例:設(shè)x=15,4個(gè)處理器,則每段直線段長度4,每直線段的起始x坐標(biāo)xa,xa+4,xa+8,xa+12。要應(yīng)用Bresenham直線算法,還必須知道每段直線段的起始y坐標(biāo)和決策參數(shù)的初始值。知道xp,則yp=mxp(3-17)第k段直線段的起始y坐標(biāo):yk=ya+round(kyp)(3-18)第k段直線段的初始決策參數(shù):pk=(kxp)(2y)-round(kyp)(2x)+2y-x三、幀緩沖器裝載用光柵顯示系統(tǒng)進(jìn)行直線段和其它物體掃描轉(zhuǎn)換顯示時(shí),必須計(jì)算幀緩沖器的位置前面,我們已經(jīng)假設(shè)由setpixel程序來完成,它將像素的亮度存儲到幀緩沖器矩陣中對應(yīng)位置,而掃描轉(zhuǎn)換算法以連續(xù)的單位間隔生成像素位置.因而,就可以用增量方法來計(jì)算幀緩沖器地址假設(shè)幀緩沖器地址是以行序?yàn)橹餍騺砭幹?,且像素位置以屏幕左下方?0,0)變化到屏幕右上方(xmax,ymax)。對于像素位置(x,y)的幀緩沖器位地址可計(jì)算為:

addr(x,y)=addr(0,0)+y(xmax+1)+x沿掃描線移動(dòng),像素(x+1,y)處的幀緩沖器地址可從位置(x,y)的地址做偏移來計(jì)算:

addr(x+1,y)=addr(x,y)+1從(x,y)對角地跳到下一條掃描線,(x+1,y+1)的幀緩沖器地址的計(jì)算公式為:

addr(x+1,y+1)=addr(x,y)+xmax+2上述的計(jì)算公式只針對黑白系統(tǒng)而言,對于能顯示彩色的顯示系統(tǒng),因?yàn)槠聊簧厦總€(gè)像素在存儲器中占用多個(gè)bit,因此,在用上述的計(jì)算公式計(jì)算特定點(diǎn)在幀緩沖器中的地址時(shí)還必須考慮像素寬度。例如8/16/24/32bit。四、圓弧生成算法由于圓是圖形和圖像中常使用的元素,因此在大多數(shù)圖形軟件中都包含了生成圓和圓弧的過程。也會提供一個(gè)既能顯示圓曲線,又能顯示橢圓曲線的過程。.4.1直角坐標(biāo)法.4.2極坐標(biāo)法.4.3折線逼近法.4.4中點(diǎn)圓算法.4.5Bresenham圓算法.4.1直角坐標(biāo)法圓被定義為所有離一中心位置(xc,yc)距離為給定值r的點(diǎn)集??捎梅匠瘫硎救缦拢?/p>

(x-xc)2+(y-yc)2=r2為簡便起見,我們討論圓心在原點(diǎn),半徑為r的圓:

x2+y2=r2可以沿x軸從-r到r,以單位步長計(jì)算對應(yīng)的y值來得到圓周上每點(diǎn)的位置:

y=±(r2-x2)1/2缺點(diǎn):計(jì)算量大,且畫出的像素位置的距離是不一致的。考慮到圓的對稱性,可先計(jì)算1/8圓,再計(jì)算其余的7/8圓。在計(jì)算1/8圓時(shí),根據(jù)DDA算法的討論,當(dāng)|m|<1時(shí),取x方向步長1,計(jì)算y后取整;當(dāng)|m|>1時(shí),取y方向步長1,計(jì)算x后取整。.4.2極坐標(biāo)法使用極坐標(biāo)法表示圓:

x=rcosθ y=rsinθ 0≤θ≤360但是,算法的計(jì)算量仍然很大。更有效的圓算法是如Bresenham畫線算法一樣以決策參數(shù)的增量計(jì)算為基礎(chǔ),僅包括簡單的整數(shù)操作。.4.3折線逼近法圓可以用內(nèi)接正多邊形來逼近。同樣,對于曲線也可以用折線段來逼近,當(dāng)然,折線段的數(shù)量越多則越逼近曲線本身,但復(fù)雜性就越大。下面我們討論用折線逼近圓。假設(shè)用n段等長折線段來逼近一段半徑R,弧角θ的圓弧,則每段圓弧對應(yīng)的弧角為δ=θ/n.誤差計(jì)算a.弧長-弦長=Rδ-Rcos(δ/n)不容易計(jì)算。b.e=半徑-|OA|=R[1-cos(δ/2)]≈2Rsin2(δ/4)≈Rδ2/8.

即:e=Rδ2/8

為了使誤差e≤ε,則:

n≥θ*[R/(8ε)]1/2

表明,對于R越大,要求的誤差越小,則所需要的折線段就越多例如:假設(shè)圓弧的半徑R=256個(gè)像素,圓弧的角度θ=π,若要求誤差不超過兩個(gè)像素,則最少需要多少段折線段來逼近該圓???.4.4中點(diǎn)圓算法像在光柵畫線算法中一樣,以單位間隔取樣并在每個(gè)步長中確定離指定圓最近的像素位置。對于給定半徑r和圓心(xc,yc),可先給出計(jì)算中心在原點(diǎn)(0,0)圓的像素位置的算法,然后通過平移使每個(gè)計(jì)算出的(x,y)移動(dòng)到其適當(dāng)?shù)钠聊晃恢谩M瑯?,只考慮1/8圓,x從0到R/21/2結(jié)束.為了應(yīng)用中點(diǎn)圓算法,定義一個(gè)圓函數(shù):

fcircle(x,y)=x2+y2-r2

則任何點(diǎn)(x,y)的相對位置可由對圓函數(shù)符合的檢測來決定: <0(x,y)位于圓邊界內(nèi)fcircle(x,y)=0(x,y)位于圓邊界上

>0(x,y)位于圓邊界外假設(shè)用該算法計(jì)算出第k個(gè)點(diǎn)(xk,yk),下一步需要決定像素位置是A(xk+1,yk),B(xk+1,yk-1),其中xk+1=xk+1 A,B的中點(diǎn)M(xk+1,yk-0.5)在M處決策參數(shù):

pk=fcircle(xk+1,yk-0.5)=xk+12+(yk-0.5)2-r2

當(dāng)pk<0,這個(gè)中點(diǎn)M在圓內(nèi),掃描線yk上的像素(xk+1,yk)更接近于圓邊界,則下一點(diǎn)應(yīng)取右邊的點(diǎn)A(xk+1,yk)。否則,中點(diǎn)M位于圓外或在邊界上,我們選擇掃描線yk-1上的像素B(xk+1,yk-1)pk+1=(xk+1+1)2+(yk+1-0.5)2-r2遞歸表達(dá)式:

pk+1=pk+2xk+1+(y2k+1-y2k)-(yk+1-yk)+1

其中:yk+1是yk(pk<0)或是yk-1(pk≥0),這取決于pk的符號。圓在起始位置(x0,y0)=(0,r)處求值就可得到初始決策參數(shù):

p0=fcircle(1,r-0.5)=5/4–r中點(diǎn)圓算法的算法表示:

p0=5/4–r xk+1=xk+1 yk+1=yk,pk+1=pk+2xk+1+1,當(dāng)pk<0yk+1=yk-1,pk+1=pk+2xk+1+1-2yk+1,當(dāng)pk≥0對于2xk+1和2yk+1本身又是一個(gè)增量表達(dá)式,2xk+1增量始終為2,而2yk+1增量為0(當(dāng)pk<0)或-2(當(dāng)pk≥0),在起始位置(x0,y0)=(0,r),2xk+1和2yk+1的初始值分別為0和2r。中點(diǎn)畫圓算法的步驟:

1.輸入圓半徑r和圓心(xc,yc),并得到圓心在原點(diǎn)的圓周上的第一點(diǎn)為:(x0,y0)=(0,r)2.計(jì)算決策參數(shù)的初始值:

p0=5/4–r3.在每個(gè)xk位置處,從k=0開始,完成下列檢測:假如pk<0,中心在(0,0)的圓的下一個(gè)點(diǎn)為(xk+1,yk),且

pk+1=pk+2xk+1+1

否則,圓的下一個(gè)點(diǎn)為(xk+1,yk-1),且

pk+1=pk+2xk+1+1-2yk+1

其中:2xk+1=2xk+1,2yk+1=2yk-24.確定在其它7個(gè)8分圓中的對稱點(diǎn)

5.將每個(gè)計(jì)算出的像素位置(x,y)移動(dòng)到中心在(xc,yc)的圓路徑上,并畫坐標(biāo)值:

x=xc+xy=yc+y6.重復(fù)步驟3到5,直至x≥y.中點(diǎn)圓算法的C實(shí)現(xiàn):voidcircleMidpoint(intxCenter,intyCenter,intradius){intx=0;inty=radius;intp=1-radius;voidcirclePlotPoints(int,int,int,int);circlePlotPoints(xCenter,yCenter,x,y);while(x<y){x++if(p<0)p+=2*x+1;else{y--;p+=2*(x-y)+1;}circlePlotPoints(xCenter,yCenter,x,y);}}voidcirclePlotPoints(intxCenter,intyCenter,intx,inty){setpixel(xCenter+x,yCenter+y);setpixel(xCenter-x,yCenter+y);setpixel(xCenter+x,yCenter-y);setpixel(xCenter-x,yCenter-y);setpixel(xCenter+y,yCenter+x);setpixel(xCenter-y,yCenter+x);setpixel(xCenter+y,yCenter-x);setpixel(xCenter-y,yCenter-x);}Ex.半徑為20個(gè)像素的1/8圓.4.5Bresenham圓算法與Bresenham直線生成算法一樣,其基本思想:利用判別變量來判斷選擇最近的像素,判別變量僅用加減和移位就可計(jì)算出來同樣,只考慮1/8圓,x從0到R/21/2結(jié)束假設(shè)用該算法計(jì)算出第k個(gè)點(diǎn)(xk,yk),下一步需要決定像素位置是A(xk+1,yk), B(xk+1,yk-1),其中xk+1=xk+1根據(jù)理論坐標(biāo)點(diǎn)與A,B的距離大小選擇A或B. da=yk2-y2=yk2-r2+xk+12

db=y2-(yk-1)2=r2-xk+12-(yk-1)2

?d=da-db≥0,則下一像素取B(xk+1,yk)?d<0,則下一像素取A(xk+1,yk-1)決策參數(shù):

pk=?d=2xk+12+(yk-1)2+yk2-2r2

pk+1=2(xk+1+1)2+(yk+1-1)2+yk+12-2r2

所以:

pk+1=pk+4xk+6+2(yk+12-yk2)-2(yk+1-yk)初始條件 起始點(diǎn)(x0,y0)=(0,r)帶入上式:

p0=3-2rBresenham圓弧算法可表示為:

p0=3-2r xk+1=xk+1 yk+1=yk-1,pk+1=pk+4(xk-yk)+10當(dāng)pk≥0

yk+1=yk,pk+1=pk+4xk+6,當(dāng)pk<0Bresenham圓弧算法的C實(shí)現(xiàn)voidcircleBres(intxCenter,intyCenter,intradius){intx=0,y=radius,p=3-2*radius;voidcirclePlotPoints(int,int,int,int);circlePlotPoints(xCenter,yCenter,x,y);while(x<y){if(p<0)p+=(4*x+6);else{p+=(4*(x-y)+10);y--;}x++;circlePlotPoints(xCenter,yCenter,x,y);}}半徑為20個(gè)像素的1/8圓五、橢圓生成算法橢圓曲線的生成考慮長軸和短軸尺寸不同,可通過修改畫圓程序來實(shí)現(xiàn).5.1橢圓的特征.5.2中點(diǎn)橢圓算法.5.1橢圓的特征橢圓被定義為到兩個(gè)定點(diǎn)(焦點(diǎn))的距離之和等于常數(shù)的點(diǎn)的集合。橢圓上任意點(diǎn)p(x,y)到兩個(gè)焦點(diǎn)的距離記為d1和d2,那么,橢圓方程可表示為:d1+d2=常數(shù)設(shè)兩個(gè)焦點(diǎn)坐標(biāo)F1=(x1,y1)和F2=(x2,y2)來表示的橢圓方程:

[(x-x1)2+(y-y1)2]1/2+[(x-x2)2+(y-y2)2]1/2=常數(shù)改寫橢圓方程,則通用橢圓方程:

Ax2+By2+Cxy+Dx+Ey+F=0標(biāo)準(zhǔn)位置的橢圓:長軸和短軸與X和Y軸平行,橢圓中心可在(xc,yc)。標(biāo)準(zhǔn)位置橢圓方程:

[(x-xc)/rx]2+[(y-yc)/ry]2=1

其中:rx

和ry分別為長半軸和短半軸。極坐標(biāo)表示:

x=xc+rxcosθ,y=yc+rysinθ標(biāo)準(zhǔn)位置的橢圓其在四分象限是對稱的,因此我們只需要計(jì)算一個(gè)四分象限的橢圓曲線位置,然后根據(jù)對稱性得到其余的部分。.5.2中點(diǎn)橢圓算法基本思想:計(jì)算橢圓中心在(0,0)的標(biāo)準(zhǔn)位置橢圓曲線的第一分象限的曲線部分的位置像素(x,y),然后將點(diǎn)變換到橢圓中心在(xc,yc)。.5.2中點(diǎn)橢圓算法基本思想:計(jì)算橢圓中心在(0,0)的標(biāo)準(zhǔn)位置橢圓曲線的第一分象限的曲線部分的位置像素(x,y),然后將點(diǎn)變換到橢圓中心在(xc,yc)。.5.2中點(diǎn)橢圓算法基本思想:計(jì)算橢圓中心在(0,0)的標(biāo)準(zhǔn)位置橢圓曲線的第一分象限的曲線部分的位置像素(x,y),然后將點(diǎn)變換到橢圓中心在(xc,yc)。.5.2中點(diǎn)橢圓算法根據(jù)前面DDA算法的討論,當(dāng)|m|≤1時(shí),取x方向單位步長(1或-1),相反,取y方向單位步長(1或-1)。因此,對于第一分象限的橢圓曲線分成兩部分:一部分曲線的斜率絕對值小于1和斜率絕對值大于1。并分別對兩段曲線分別取x方向步長和y方向取步長.這里可選擇(0,ry)或(rx,0)作為起點(diǎn)開始算法。以從(0,ry)開始從左到右進(jìn)行。橢圓函數(shù)作為決策參數(shù):

fellipse(x,y)=ry2x2+rx2y2-rx2ry2

該函數(shù)具有如下特性:

<0(x,y)位于橢圓邊界內(nèi)fellipse(x,y)=0(x,y)位于橢圓邊界上

>0(x,y)位于橢圓邊界外橢圓函數(shù)fellipse(x,y)作為中點(diǎn)橢圓算法的決策參數(shù)。在每個(gè)取樣位置,按照橢圓函數(shù)在沿橢圓軌跡兩個(gè)候選像素點(diǎn)的中點(diǎn)求值的符號選擇下一個(gè)像素從(0,ry)開始,在x方向取單位步長1直到斜率變?yōu)椤?1。橢圓的斜率:

dy/dx=-ry2x/rx2y兩段曲線采用不同的算法的分界點(diǎn):

2ry2x=2rx2y對于第1段曲線設(shè)用該算法計(jì)算出點(diǎn)(xk,yk),下一個(gè)點(diǎn)(xk+1,yk+1)為A(xk+1,yk)或B(xk+1,yk-1),即右邊點(diǎn)或右下點(diǎn)。根據(jù)如下決策參數(shù)符號判斷: p1k=fellipse(xk+1,yk-0.5)=ry2(xk+1)2+rx2(yk-0.5)2-rx2ry2

下一點(diǎn)的判斷:當(dāng)p1k<0,取A(xk+1,yk),

yk+1=yk

當(dāng)p1k≥0,取B(xk+1,yk-1),

yk+1=yk-1其中xk+1=xk+1遞歸表達(dá)式:

p1k+1=p1k+2ry2(xk+1)+ry2+rx2[(yk+1-0.5)2-(yk-0.5)2]初始決策參數(shù):將(x0,y0)=(0,ry)帶入:p10=fellipse(1,ry-0.5)=ry2-rx2ry+rx2/4該橢圓第一分象限的第一部分橢圓曲線的中點(diǎn)算法表示:

p10=ry2-rx2ry+rx2/4xk+1=xk+1yk+1=yk

,p1k+1=p1k+2ry2xk+1+ry2

當(dāng)p1k<0yk+1=yk-1,p1k+1=p1k+2ry2xk+1+ry2-2rx2yk+1

當(dāng)p1k≥0決策參數(shù)增量=2ry2xk+1+ry2當(dāng)p1k<02ry2xk+1+ry2-2rx2yk+1當(dāng)p1k≥0對于2ry2xk+1和2rx2yk+1本身又是一個(gè)增量表達(dá)式,2ry2xk+1增量始終為2ry2,而2rx2yk+1增量為0(當(dāng)p1k<0)或-2rx2(當(dāng)p1k≥0),在起始位置(x0,y0)=(0,ry),2ry2xk+1和2rx2yk+1的初始值分別為0和2rx2ry。然而對于第一分象限的第2段曲線,取y方向單位步長。在每一步,計(jì)算決策參數(shù)時(shí)取兩個(gè)候選水平像素的中點(diǎn)。設(shè)前一步取(xk,yk),下一個(gè)點(diǎn)(xk+1,yk+1)的選擇:B(xk,yk-1)或A(xk+1,yk-1),即下邊點(diǎn)或右下點(diǎn)。M(xk+0/5,yk-1)為AB的中點(diǎn)。根據(jù)如下決策參數(shù)符號判斷:

p2k=fellipse(xk+0.5,yk-1)=ry2(xk+0.5)2+rx2(yk-1)2-rx2ry2

取點(diǎn)的判斷:

p2k≤0,取(xk+1,yk-1),(xk+1,yk+1)=(xk+1,yk-1),

即右下點(diǎn)Ap2k>0,取(xk,yk-1),(xk+1,yk+1)=(xk,yk-1),

即下邊點(diǎn)B遞歸表達(dá)式:

p2k+1=p2k-2rx2(yk-1)+rx2+ry2[(xk+1+0.5)2-(xk+0.5)2]當(dāng)從第一分象限橢圓的第1段曲線進(jìn)入第2段曲線時(shí),采用p2k作為決策參數(shù),此時(shí),p2k的初始點(diǎn)為第段曲線的最后計(jì)算點(diǎn),設(shè)為(x0,y0)。則第二部分曲線的初始決策參數(shù):p20=fellipse(x0+0.5,y0-1)=ry2(x0+0.5)2+rx2(y0-1)2-rx2ry2

該橢圓第一分象限的第2段橢圓曲線的中點(diǎn)算法表示:

p20=ry2(x0+0.5)2+rx2(y0-1)2-rx2ry2yk+1=yk-1xk+1=xk,p2k+1=p2k-2rx2yk+1+rx2,當(dāng)p2k>0xk+1=xk+1,p2k+1=p2k-rx2yk+1+rx2+2ry2xk+1

當(dāng)p2k≤0決策參數(shù)增量=-2rx2yk+1+rx2當(dāng)p2k>0-2rx2yk+1+rx2+2ry2xk+1當(dāng)p2k≤0對于2rx2yk+1和2ry2xk+1本身又是一個(gè)增量表達(dá)式,2rx2yk+1增量始終為-2rx2,而2ry2xk+1增量為0(當(dāng)p2k>0)或2ry2(當(dāng)p2k≤0),在起始位置(x0,y0),2rx2yk+1和2ry2xk+1的初始值分別為2rx2y0和2ry2x0。中點(diǎn)橢圓算法步驟:1.輸入rx,ry和橢圓中心(xc,yc),并得到中心在原點(diǎn)的橢圓上的第一個(gè)點(diǎn)。2.計(jì)算第一分象限的第1段橢圓曲線的決策參數(shù)的初值:

p10=ry2-rx2ry+rx2/43.在第1段曲線的每個(gè)xk處,從k=0開始,完成下列測試:假如當(dāng)p1k<0,則下一個(gè)點(diǎn)為(xk+1,yk+1)=(xk+1,yk),且:p1k+1=p1k+2ry2(xk+1)+ry2,否則,下一個(gè)點(diǎn)為(xk+1,yk+1)=(xk+1,yk-1),且:p1k+1=p1k+2ry2(xk+1)+ry2-2rx2(yk-1)。且循環(huán)至2ry2x≥2rx2y,循環(huán)結(jié)束得到最后點(diǎn)(x0,y0)。4.使用第1段曲線計(jì)算最后得到的點(diǎn)(x0,y0),來計(jì)算第2段曲線的初始決策參數(shù):

p20=ry2(x0+0.5)2+rx2(y0-1)2-rx2ry25.在第2段曲線的每個(gè)yk處,從k=0開始,完成下列檢測:假如p2k>0,則下一個(gè)點(diǎn)為(xk+1,yk+1)=(xk,yk-1),且p2k+1=p2k-2rx2(yk-1)+rx2,否則下一個(gè)點(diǎn)為(xk+1,yk+1)=(xk+1,yk-1),且p2k+1=p2k-2rx2(yk-1)+rx2+2ry2(xk+1),且循環(huán)至2rx2y=0即y=0。6.確定其它三個(gè)分象限中對稱的點(diǎn)。7.將每個(gè)計(jì)算出像素位置(x,y)移到中心在(xc,yc)的橢圓軌跡上,并按坐標(biāo)畫點(diǎn):x=x+xc,y=y+yc。中點(diǎn)橢圓算法的C實(shí)現(xiàn)#defineROUND(a)((int)(a+0.5))voidellipseMidpoint(intxCenter,intyCenter,intRx,intRy){intRx2=Rx*Rx,Ry2=Ry*Ry;inttwoRx2=2*Rx2,twoRy2=2*Ry2;intp,x=0,y=Ry,px=0,py=twoRx2*y;

voidellipsePlotPoints(int,int,int,int);ellipsePlotPoints(xCenter,yCenter,x,y);

p=ROUND(Ry2-(Rx2*Ry)+(0.25*Rx2));

while(px<py){x++;px+=twoRy2;if(p<0)p+=Ry2+px;else{y--,py-=twoRx2;p+=Ry2+px-py;}ellipsePlotPoints(xCenter,yCenter,x,y);}/*section2*/p=ROUND(Ry2*(x+0.5)*(x+0.5)+Rx2*(y-1)*(y-1)-Rx2*Ry2);while(y>0){y--;py-=twoRx2;if(p>0)p+=Rx2-py;else{x++;px+=twoRy2;p+=Rx2-py+px;}ellipsePlotPoints(xCenter,yCenter,x,y);}}voidellipseMidPoints(intxCenter,intyCenter,intx,inty){setpixel(xCenter+x,yCenter+y);setpixel(xCenter-x,yCenter+y);setpixel(xCenter+x,yCenter-y);setpixel(xCenter-x,yCenter-y);}思考:1.由于第2段曲線的初始決策參數(shù)依賴于第1段曲線最后計(jì)算的點(diǎn),因此兩個(gè)部分不能同時(shí)進(jìn)行,如何修改一下算法,使兩部分曲線的計(jì)算可同時(shí)進(jìn)行。2.對于非標(biāo)準(zhǔn)位置(長/短半軸不與坐標(biāo)軸重合)的橢圓,如何實(shí)現(xiàn)?六、其它輸出圖元的生成點(diǎn)、線、圓是圖形設(shè)計(jì)中最基本的元素,此外,設(shè)計(jì)中還需要其它圖元,如曲線、文字和符號常用曲線:正弦函數(shù)曲線、指數(shù)函數(shù)曲線、多項(xiàng)式函數(shù)曲線、概率分布函數(shù)曲線及樣條函數(shù)曲線等。曲線生成與圓和橢圓相似。思考:如何繪制曲線,如正弦函數(shù)曲線。七、輸出圖元的屬性.7.1直線屬性.7.2曲線屬性.7.3顏色和灰度等級.7.4填充區(qū)域的屬性通常,任何影響圖元顯示方法的參數(shù)被稱為屬性參數(shù)。如顏色、大小等屬性是確定圖元的基本特性;其它則指出在特定條件下怎樣顯示圖元。如三維視圖的深度信息以及交互式對象選擇程序所需的可見性或可檢測性。這里我們僅考慮哪些控制圖元基本顯示特性的屬性,而不考慮特定條件。如線段可以是點(diǎn)線或虛線、粗線或細(xì)線以及藍(lán)色或其它顏色等。區(qū)域可用一種顏色或多色圖案填充。文本可從左到右閱讀方式顯示,沿屏幕對角線傾斜或按垂直列向顯示.7.1直線屬性直線段的基本屬性線型寬度顏色在一些軟件包中,線用可選擇的筆或刷來顯示。下面,考慮怎樣修改畫線程序來實(shí)現(xiàn)各種指定屬性。線型線型屬性可能包括實(shí)線、虛線和點(diǎn)線等。我們通過設(shè)置沿線路徑顯示的實(shí)線段的長度和間距來修改畫線算法,以生成各種類型的線。虛線可通過在實(shí)線段間插入與實(shí)線段等長的空白段來顯示;畫線的長度和空白段長度常作為用戶的選項(xiàng)來指定。點(diǎn)線,可通過生成很短的畫線和等于或大于畫線大小的空白段來顯示對于各種畫線、點(diǎn)線和點(diǎn)畫線,用像素掩模來指定實(shí)線段和空白段的長度。例如,掩模1111000可表示畫線長度為四個(gè)像素和中間空白段為3個(gè)像素的虛線。用固定數(shù)目的像素畫線會產(chǎn)生如圖所示的在不同方向不同長度的線段。為此,可按線的斜率來調(diào)整實(shí)心段和空白段的像素?cái)?shù)目。另一個(gè)保持畫線等長的方法是將畫線看作為單獨(dú)的線段,將每條畫線的端點(diǎn)坐標(biāo)定位后,調(diào)用沿畫線路徑計(jì)算像素位置的畫線程序。線寬線寬選擇的實(shí)現(xiàn)取決于輸出設(shè)備的能力。在視頻顯示器上的粗線可以用相鄰的平行線來顯示。在光柵實(shí)現(xiàn)中,標(biāo)準(zhǔn)線寬是用像Bresenham算法那樣在每個(gè)取樣位置處用一個(gè)像素來生成。其它寬度是作為標(biāo)準(zhǔn)線的正整數(shù)倍通過沿相鄰平行線路徑畫額外的像素而顯示的。對于斜率絕對值小于1的線,可修改畫線程序,通過在沿線的每個(gè)x位置畫像素的垂直段來顯示粗線。每段的像素?cái)?shù)目等于線寬的整數(shù)值。在圖中,我們通過在原線段路徑之上生成一條平行線而畫出了雙倍線寬的線段。在每個(gè)位置x處,計(jì)算對應(yīng)的y坐標(biāo),并使用屏幕坐標(biāo)(x,y)和(x,y+1)畫像素。通過交替地在單線寬度的上下畫像素就可以顯示線寬≥3的粗線對于斜率絕對值大于1的粗線,可以在水平段交替地畫線段路徑左邊和右邊像素形成粗線,如圖,其線寬為4,用水平段繪制。盡管通過繪制水平段或垂直段能快速地生成粗線,但線的顯示寬度(垂直于線段路徑測量)仍取決于線的斜率,45o線的顯示線寬只有垂直線或水平線的用水平段或垂直段實(shí)現(xiàn)寬度選擇的另一個(gè)問題是:不管斜率多少,所生成線段的端點(diǎn)是水平或垂直的。這對于較粗的線的影響更突出。我們可以通過添加“線帽”來調(diào)整線端的形狀以給出較好的外觀,如圖。線帽有方帽、圓帽和突方帽。方帽通過調(diào)整所構(gòu)成平行線的端點(diǎn)位置,使粗線的顯示具有垂直于線段路徑的正方形端點(diǎn)。假如指定線的斜率m,則粗線的方端的斜率-1/m。生成粗線的其它方法包括將顯示線段看作填充長方形,或用選定的筆或刷樣式來生成線段。生成粗折線需要一些額外的處理。通常,顯示單根折線段所用的方法不能生成光滑連接的折線段。我們可通過在線段端點(diǎn)進(jìn)行額外處理來生成光滑連接的粗折線。圖顯示出了兩線段光滑連接的三種可能方法:斜角連接、圓連接和斜切連接。斜角連接通過延伸兩條線的外邊界直到它們相交來完成。圓連接通過用直徑等于線寬的圓弧邊界將兩線段間連接而成。斜切連接則是通過用方帽和在兩線段相交處的三角形間歇中填充來生成顏色當(dāng)系統(tǒng)提供顏色(或亮度)選擇時(shí),給出當(dāng)前顏色索引的參數(shù)被包括在系統(tǒng)屬性表中。折線程序以當(dāng)前顏色顯示折線,是通過用setPixel程序?qū)⑦@種顏色設(shè)置在幀緩沖器中沿線段路徑像素位置處得以實(shí)現(xiàn)。顏色選擇的數(shù)目取決于幀緩沖器中每個(gè)像素有效值的數(shù)目筆和畫刷有些圖形軟件包中,線可選擇筆或刷的方式來顯示。選項(xiàng)包括形狀、尺寸和式樣。如圖顯示的可能的筆和刷形狀。這些形狀可以以像素位置數(shù)值形式存儲在一個(gè)像素模板中,在必要時(shí)設(shè)置到線段路徑上。例如圖顯示的是一個(gè)長方形筆的像素模板,用這個(gè)模板的中心沿線段路徑運(yùn)動(dòng)可畫出相應(yīng)寬度的線段通過改變筆或刷的像素模板的尺寸,則使用該模板的筆或刷來生成的線段就可以有不同的寬度.7.2曲線屬性曲線屬性的參數(shù)與直線段相同,我們可用各種顏色、寬度、點(diǎn)劃模式和有效的筆或刷選擇來顯示曲線。采用畫線算法來適應(yīng)屬性選擇的方法也類似于畫直線。如圖,顯示的一個(gè)用模板11100來生成虛線圓弧??捎脠A的對稱性生成圓的其它部分。如前面討論的一樣,各種寬度的光柵曲線可用水平或垂直像素段來顯示,曲線斜率的絕對值小于1,用垂直段;斜率絕對值大于1,用水平段。如圖示另一種顯示粗曲線的方法是填充兩條距離等于預(yù)定寬度的平行曲線路徑間的區(qū)域。可以用指定的曲線路徑作為一條邊界,并在其內(nèi)側(cè)或外側(cè)建立第二條邊界來實(shí)現(xiàn),然而,這樣的粗曲線會發(fā)生偏移,因此,通常在曲線路徑兩側(cè)以預(yù)定寬度的一半距離,設(shè)置兩條邊界曲線來保持曲線位置,如圖。曲線的筆或刷顯示可使用前面直線段中討論的相同方法來實(shí)現(xiàn)。當(dāng)曲線斜率為1時(shí),用這種長方形筆顯示的曲線會比較粗。因此,要顯示一致的曲線寬度可通過旋轉(zhuǎn)長方形筆以使其在沿曲線移動(dòng)時(shí)與曲線斜率方向一致,或用圓弧筆來實(shí)現(xiàn).7.3顏色和灰度等級通用光柵掃描系統(tǒng)通常提供較多的顏色,而隨機(jī)掃描系統(tǒng)最多只能提供幾種顏色供選擇。顏色選項(xiàng)用0到某一正整數(shù)值編碼。對于CRT顯示器,這些顏色碼被轉(zhuǎn)換成電子束的強(qiáng)度等級。對于彩色繪圖儀,這些編碼將控制噴墨或選筆.顏色信息可以用兩種方法存儲在幀緩沖器中:1.將顏色碼直接存儲在幀緩沖器中.2.把顏色碼放在一個(gè)獨(dú)立的表(調(diào)色板)中并用像素值作為這個(gè)表的索引.利用直接存儲策略,一旦在應(yīng)用程序中指定某種顏色編碼,就在幀緩沖器中為要以那種顏色顯示的輸出圖元的每個(gè)組成像素設(shè)置為對應(yīng)的二進(jìn)制值.例如,每個(gè)像素占3位存儲器時(shí),它提供了最小數(shù)目的彩色顏色數(shù),三位位置的每一位用來控制RGB顯示器中對應(yīng)電子槍的亮度等級(開或關(guān)),給緩沖器中每個(gè)像素增加位數(shù)將使可選擇的顏色數(shù)量增加,假如每個(gè)像素6位,則每支電子槍用2位,這允許三支電子槍的每一支具有四種不同的亮度,對每個(gè)屏幕像素共有64個(gè)有效顏色。對于1024×1024的分辨率,真彩色/全色(每個(gè)像素占24位)RGB系統(tǒng)需要幀緩沖器的存儲量:1024×1024×24bit=3Mbyte。彩色表是不需要增大幀緩沖器而又?jǐn)U充顏色能力的一種變換方法顏色表圖顯示了在彩色查找表中存儲顏色值的一種方案。在該表中,幀緩沖器值用作彩色表的索引。在這個(gè)例子中,每個(gè)像素在幀緩沖器中占用8位,可引用表中256個(gè)表位置的任何一個(gè),表中的每個(gè)表項(xiàng)可用24位來指定RGB顏色。擁有這種特殊查找表的系統(tǒng),將允許用戶從將近1億7千萬種顏色的調(diào)色表中選擇任意256種顏色同時(shí)顯示。與真彩色系統(tǒng)相比,這種方案減少了可以同時(shí)顯示的顏色數(shù)目,但它也將緩沖器的容量需要減少到1M。有些圖形系統(tǒng)在幀緩沖器中為每個(gè)像素提供9位,允許用戶在每次顯示中能

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論