CG-4-2區(qū)域填充_第1頁
CG-4-2區(qū)域填充_第2頁
CG-4-2區(qū)域填充_第3頁
CG-4-2區(qū)域填充_第4頁
CG-4-2區(qū)域填充_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、4.4 區(qū)域填充區(qū)域填充 4.4.1 有序邊表填充算法有序邊表填充算法 本節(jié)討論如何用一種顏色或圖案來填充一個二本節(jié)討論如何用一種顏色或圖案來填充一個二維區(qū)域。填充的區(qū)域可以是多邊形的,也可以是圓維區(qū)域。填充的區(qū)域可以是多邊形的,也可以是圓或橢圓的,還可以是帶孔的。區(qū)域填充可以分兩步或橢圓的,還可以是帶孔的。區(qū)域填充可以分兩步進(jìn)行,第一步先確定需要填充哪些像素。第二步確進(jìn)行,第一步先確定需要填充哪些像素。第二步確定用什么顏色值或圖案來填充。定用什么顏色值或圖案來填充。 多邊形區(qū)域填充的一種常用方法是按掃描線順多邊形區(qū)域填充的一種常用方法是按掃描線順序,計算掃描線與多邊形的相交區(qū)間,再用要求的序

2、,計算掃描線與多邊形的相交區(qū)間,再用要求的顏色顯示這些區(qū)間的像素,即完成填充工作。顏色顯示這些區(qū)間的像素,即完成填充工作。A B C DP1P2P3P4P5P62 4 6 8 10 2468Oyx 如圖所示,掃描線如圖所示,掃描線3與與多邊形的邊界線交于四點多邊形的邊界線交于四點A、B、C、D。交點交點(x坐標(biāo)坐標(biāo))序序列為:列為:3、4.5、 6、8.3 把交點從小到大逐對取把交點從小到大逐對取出,構(gòu)成區(qū)間:出,構(gòu)成區(qū)間: 3, 4.5, 6, 8.3。這。這兩個區(qū)間落在多邊兩個區(qū)間落在多邊形內(nèi),該區(qū)間內(nèi)的像素應(yīng)形內(nèi),該區(qū)間內(nèi)的像素應(yīng)該填充,其他區(qū)間不填充。該填充,其他區(qū)間不填充。 圖圖 多

3、邊形與掃描線多邊形與掃描線 在多邊形頂點處的交點需要專門處理。在多邊形頂點處的交點需要專門處理。 例如圖所示,掃描線例如圖所示,掃描線2與多邊形相交于與多邊形相交于P6,若,若交點算一個,則求得交點交點算一個,則求得交點( (x坐標(biāo)坐標(biāo)) )序列序列3, 6.5, 7.5。這將導(dǎo)致這將導(dǎo)致 3, 6.5區(qū)間內(nèi)的像素被填充,而這個區(qū)間區(qū)間內(nèi)的像素被填充,而這個區(qū)間的像素是屬于多邊形外部,不需要填充。的像素是屬于多邊形外部,不需要填充。A B C DP1P2P3P4P5P62 4 6 8 10 2468Oyx 為了正確地進(jìn)行交點取舍,必須對上述兩種情為了正確地進(jìn)行交點取舍,必須對上述兩種情況區(qū)別對

4、待。況區(qū)別對待。 具體實現(xiàn)時,只需檢查頂點的兩條邊的另外具體實現(xiàn)時,只需檢查頂點的兩條邊的另外兩個端點的兩個端點的y值。按這兩個值。按這兩個y值中大于交點值中大于交點y值的個值的個數(shù)是數(shù)是0,1,2來決定是取零個、一個、還是兩個。來決定是取零個、一個、還是兩個。A B C DP1P2P3P4P5P62 4 6 8 10 2468Oyx 例如,掃描線例如,掃描線2交頂點交頂點P6,由于共享該頂點的,由于共享該頂點的兩條邊的另外二個頂點均高于掃描線,故交點兩條邊的另外二個頂點均高于掃描線,故交點P6取取兩次,兩次,則交點序列為則交點序列為:3 3、3、 6.5、 7.5 。即。即3, 3 6.5,

5、 7.5二個區(qū)間內(nèi)的像素被填充二個區(qū)間內(nèi)的像素被填充。 而而掃描線掃描線7與多邊形相交于與多邊形相交于P1,該交點算一個,該交點算一個,則交點序列為:則交點序列為:2, 10,即,即2, 10區(qū)間內(nèi)的像素被填區(qū)間內(nèi)的像素被填充充。 A B C DP1P2P3P4P5P62 4 6 8 10 2468Oyx 由于邊的連貫性,即當(dāng)某條邊與當(dāng)前掃描線由于邊的連貫性,即當(dāng)某條邊與當(dāng)前掃描線相交時,它很可能也與下一條掃描線相交,為此,相交時,它很可能也與下一條掃描線相交,為此,計算下一條掃描線與同一條邊的交點計算下一條掃描線與同一條邊的交點x值時,只需值時,只需把當(dāng)前交點把當(dāng)前交點x值加上一個邊的反斜率

6、即可:值加上一個邊的反斜率即可: xk+1 = xk + 1 / m (m為邊的斜率為邊的斜率) ) A B C DP1P2P3P4P5P62 4 6 8 10 2468Oyx 歸納上述討論,我們可寫出多邊形區(qū)域填充的歸納上述討論,我們可寫出多邊形區(qū)域填充的步驟為:步驟為: 輸入欲填充多邊形的頂點數(shù)及其頂點坐標(biāo)。輸入欲填充多邊形的頂點數(shù)及其頂點坐標(biāo)。這里,頂點數(shù)為實際頂點數(shù)加這里,頂點數(shù)為實際頂點數(shù)加1,最后一個頂點坐,最后一個頂點坐標(biāo)與第一個頂點坐標(biāo)相同。標(biāo)與第一個頂點坐標(biāo)相同。 計算所有多邊形頂點坐標(biāo)中計算所有多邊形頂點坐標(biāo)中y的最大值和最的最大值和最小值,以此作為掃描線的處理范圍。小值,

7、以此作為掃描線的處理范圍。 對處理范圍內(nèi)的每條掃描線建立有序邊表。對處理范圍內(nèi)的每條掃描線建立有序邊表。 對處理范圍內(nèi)的每條掃描線,重復(fù)下列步驟:對處理范圍內(nèi)的每條掃描線,重復(fù)下列步驟: A用有序邊表建立當(dāng)前掃描線的活化邊表;用有序邊表建立當(dāng)前掃描線的活化邊表; B從活化邊表中依次取出一對交點,對該兩個從活化邊表中依次取出一對交點,對該兩個交點內(nèi)的像素進(jìn)行填充;交點內(nèi)的像素進(jìn)行填充; C為下一條掃描線更新活化邊表,即增加交點為下一條掃描線更新活化邊表,即增加交點的的x值和刪除不再相交的邊;值和刪除不再相交的邊; D重排活化邊表。重排活化邊表。 有序邊表填充算法的有序邊表填充算法的C語言描述(略

8、)語言描述(略) 4.4.2 邊填充算法邊填充算法 邊填充算法的基本思想是:求每一條掃描線和邊填充算法的基本思想是:求每一條掃描線和多邊形各邊的交點多邊形各邊的交點(x1, y1),將該掃描線上交點右方,將該掃描線上交點右方的所有像素取補(bǔ)。的所有像素取補(bǔ)。 對多邊形的每條邊作此處理,多邊形的順序隨對多邊形的每條邊作此處理,多邊形的順序隨意。如圖所示,為應(yīng)用最簡單的邊填充算法填充一意。如圖所示,為應(yīng)用最簡單的邊填充算法填充一個多邊形的示意圖。個多邊形的示意圖。 P5P4P3P1P2P2 P3P3 P4P4 P5P5 P1圖圖 邊填充算法邊填充算法示意圖示意圖 本算法的優(yōu)點是簡單,缺點是對于復(fù)雜圖

9、形,本算法的優(yōu)點是簡單,缺點是對于復(fù)雜圖形,每一像素可能被訪問多次,輸入每一像素可能被訪問多次,輸入/輸出的量比有序輸出的量比有序邊表算法大得多。邊表算法大得多。 為了減少邊填充算法訪問像素的次數(shù),可引入為了減少邊填充算法訪問像素的次數(shù),可引入柵欄。所謂柵欄指的是一條與掃描線垂直的直線,柵欄。所謂柵欄指的是一條與掃描線垂直的直線,柵欄位置通常取過多邊形頂點、且把多邊形分為左柵欄位置通常取過多邊形頂點、且把多邊形分為左右兩半。右兩半。 柵欄填充法的基本思想是:對于每個掃描線與柵欄填充法的基本思想是:對于每個掃描線與多邊形的交點,就將交點與柵欄之間的像素取補(bǔ)。多邊形的交點,就將交點與柵欄之間的像素

10、取補(bǔ)。若交點位于柵欄左側(cè),則將交點之右至柵欄之左的若交點位于柵欄左側(cè),則將交點之右至柵欄之左的所有像素取補(bǔ);若交點位于柵欄右邊,則將柵欄之所有像素取補(bǔ);若交點位于柵欄右邊,則將柵欄之右至交點之左的像素取補(bǔ)。圖右至交點之左的像素取補(bǔ)。圖3.10為柵欄填充法示為柵欄填充法示意圖。意圖。 P5P4P3P1P2P2 P3P4 P5P3 P4P5 P1圖圖 柵欄填充算法示意圖柵欄填充算法示意圖 4.4.3 種子填充算法種子填充算法 種子填充算法則采用不同的原理:填充方法種子填充算法則采用不同的原理:填充方法是從多邊形區(qū)域內(nèi)部的一點開始,由此出發(fā)找到是從多邊形區(qū)域內(nèi)部的一點開始,由此出發(fā)找到區(qū)域內(nèi)的所有像

11、素。這種填充算法在交互式繪圖區(qū)域內(nèi)的所有像素。這種填充算法在交互式繪圖中很常用。中很常用。 種子填充算法采用的邊界定義是區(qū)域邊界上種子填充算法采用的邊界定義是區(qū)域邊界上所有像素均具有某個特定的顏色值,區(qū)域內(nèi)部所所有像素均具有某個特定的顏色值,區(qū)域內(nèi)部所有像素均不取這一特定顏色,而邊界外的像素則有像素均不取這一特定顏色,而邊界外的像素則可具有與邊界相同的顏色值??删哂信c邊界相同的顏色值。 程序從程序從( (x,y) )開始,先檢測該點的顏色,如果開始,先檢測該點的顏色,如果它與邊界色和填充色均不相同,就用填充色填充該它與邊界色和填充色均不相同,就用填充色填充該點,然后檢測相鄰位置,以確定它們是否

12、是邊界色點,然后檢測相鄰位置,以確定它們是否是邊界色和填充色,若不是,就填充該相鄰點。這個過程延和填充色,若不是,就填充該相鄰點。這個過程延續(xù)到已經(jīng)檢測完區(qū)域邊界范圍內(nèi)的所有像素為止。續(xù)到已經(jīng)檢測完區(qū)域邊界范圍內(nèi)的所有像素為止。 從當(dāng)前點檢測相鄰像素有兩種方法:四向連從當(dāng)前點檢測相鄰像素有兩種方法:四向連通和八向連通。四向連通方法指的是從區(qū)域上一通和八向連通。四向連通方法指的是從區(qū)域上一點出發(fā),可通過四個方向,即上、下、左、右移點出發(fā),可通過四個方向,即上、下、左、右移動的組合,在不越出區(qū)域的前提下,到達(dá)區(qū)域內(nèi)動的組合,在不越出區(qū)域的前提下,到達(dá)區(qū)域內(nèi)的任意像素;的任意像素; 4連通 從區(qū)域內(nèi)

13、任意一點出發(fā),可通過上、下、左、從區(qū)域內(nèi)任意一點出發(fā),可通過上、下、左、右四個方向到達(dá)區(qū)域內(nèi)的任意象素;右四個方向到達(dá)區(qū)域內(nèi)的任意象素; 8連通 從區(qū)域內(nèi)任意一點出發(fā),可通過上、下、左、從區(qū)域內(nèi)任意一點出發(fā),可通過上、下、左、右、左上、左下、右上、右下八個方向到達(dá)區(qū)右、左上、左下、右上、右下八個方向到達(dá)區(qū)域內(nèi)的任意象素。域內(nèi)的任意象素。 4連通區(qū)域和8連通區(qū)域 四連通區(qū)域 八連通區(qū)域 區(qū)域的表示方法內(nèi)點表示 枚舉出區(qū)域內(nèi)部的所有枚舉出區(qū)域內(nèi)部的所有像素像素 內(nèi)部的所有像素著同一內(nèi)部的所有像素著同一個顏色個顏色邊界表示 枚舉出邊界上所有的像素枚舉出邊界上所有的像素 邊界上的所有像素著同一顏色邊界

14、上的所有像素著同一顏色 內(nèi)部像素著與邊界像素不同的顏色內(nèi)部像素著與邊界像素不同的顏色 八向連通方法指的是區(qū)域內(nèi)每一個像素,可以八向連通方法指的是區(qū)域內(nèi)每一個像素,可以通過左、右、上、下、左上、右上、左下、右下這通過左、右、上、下、左上、右上、左下、右下這八個方向的移動的組合來到達(dá)。八個方向的移動的組合來到達(dá)。 種子填充算法中允許從四個方向?qū)ふ蚁乱幌袼胤N子填充算法中允許從四個方向?qū)ふ蚁乱幌袼卣?,稱為四向算法;允許從八個方向搜索下一像素者,稱為四向算法;允許從八個方向搜索下一像素者,稱為八向算法。八向算法可以填充八向連通區(qū)者,稱為八向算法。八向算法可以填充八向連通區(qū)域,也可以填充四向連通區(qū)域。但四

15、向算法只能填域,也可以填充四向連通區(qū)域。但四向算法只能填充四向連通區(qū)域,而不能填充八向填充區(qū)域。以下充四向連通區(qū)域,而不能填充八向填充區(qū)域。以下我們只討論四向算法。只要把搜索方向從四個改變我們只討論四向算法。只要把搜索方向從四個改變八個,即可得到八向算法。八個,即可得到八向算法。 下面程序給出了四向連通填充的遞歸算法。下面程序給出了四向連通填充的遞歸算法。void boundaryfill4 (int seedx, int seedy, int fcolor, int bcolor) int current = getpixel (seedx, seedy); if (current != b

16、color) & (current != fcolor) putpixel (seedx, seedy, fcolor);boundaryfill4 (seedx +1, seedy, fcolor, bcolor);boundaryfill4 (seedx 1, seedy, fcolor, bcolor);boundaryfill4 (seedx, seedy +1, fcolor, bcolor);boundaryfill4 (seedx, seedy 1, fcolor, bcolor); void SeedFill (int cnt, POINT *pts, int seed

17、x, int seedy, int fcolor, int bcolor) POINT v1,v2; int i; for (i=0; i cnt 1; i +) v1 = pts i ; v2 = pts i +1; BoundaryMark (v1.x, v1.y, v2.x, v2.y, bcolor); boundaryfill4 (seedx, seedy, fcolor, bcolor); 這種算法的優(yōu)點是算法簡單,易于實現(xiàn),也可這種算法的優(yōu)點是算法簡單,易于實現(xiàn),也可以填充帶有內(nèi)孔的平面區(qū)域。但是這種算法需要很以填充帶有內(nèi)孔的平面區(qū)域。但是這種算法需要很大的存儲空間以實現(xiàn)棧結(jié)構(gòu),

18、同一個像素多次入棧大的存儲空間以實現(xiàn)棧結(jié)構(gòu),同一個像素多次入棧和出棧,所花費(fèi)的時間也很多。因此后來提出了許和出棧,所花費(fèi)的時間也很多。因此后來提出了許多改進(jìn)的算法,如書上的掃描線種子填充算法,鏈多改進(jìn)的算法,如書上的掃描線種子填充算法,鏈隊列種子填充算法。隊列種子填充算法。 鏈隊列種子填充算法的算法基本思路是:從鏈鏈隊列種子填充算法的算法基本思路是:從鏈隊列中獲得一個像素點,判斷其四連通像素點,若隊列中獲得一個像素點,判斷其四連通像素點,若沒有填充,則填充它,并將它入隊列,如此循環(huán),沒有填充,則填充它,并將它入隊列,如此循環(huán),直到隊列空為止。直到隊列空為止。 4.4.4 圓和橢圓的填充圓和橢圓

19、的填充 上面所討論的多邊形區(qū)域的填充原理也可以推上面所討論的多邊形區(qū)域的填充原理也可以推廣到圓域的填充。由于圓和橢圓的特殊屬性,即可廣到圓域的填充。由于圓和橢圓的特殊屬性,即可依據(jù)任何欲填充的像素點與圓心的距離是否大于或依據(jù)任何欲填充的像素點與圓心的距離是否大于或小于半徑來判斷是否在圓外或圓內(nèi),或者依據(jù)欲填小于半徑來判斷是否在圓外或圓內(nèi),或者依據(jù)欲填充的像素點與橢圓兩焦點的距離之和是否大于或小充的像素點與橢圓兩焦點的距離之和是否大于或小于橢圓的半徑常數(shù)來判斷是否在橢圓外或橢圓內(nèi),于橢圓的半徑常數(shù)來判斷是否在橢圓外或橢圓內(nèi),因此圓和橢圓的填充采用種子填充算法最為簡單,因此圓和橢圓的填充采用種子填

20、充算法最為簡單,并且它不需要先對圓或橢圓邊界進(jìn)行掃描轉(zhuǎn)換。并且它不需要先對圓或橢圓邊界進(jìn)行掃描轉(zhuǎn)換。 以下是圓的四向連通填充算法的以下是圓的四向連通填充算法的C語言描述。語言描述。void CircleFill4 (int xc, int yc, int r, int seedx, int seedy, int color) int fill = getpixel (seedx, seedy); if (seedx xc) * (seedx xc) + (seedy yc) * (seedy yc) next; while ( p1 ) p2 = p1 next; for ( i = p1 x

21、; i x; i +)if (pattern i % 8 scan % 8 ) putpixel ( i, scan, color ); p1 = p2 next; 上述程序的一個運(yùn)行結(jié)果如圖上述程序的一個運(yùn)行結(jié)果如圖3.12所示。所示。 圖圖3.12 圖案填圖案填充的一個實例充的一個實例 4.4.6 線寬與線型的處理線寬與線型的處理 1、 直線線寬的處理直線線寬的處理 在實際應(yīng)用中,除了使用單像素寬的線條,還在實際應(yīng)用中,除了使用單像素寬的線條,還經(jīng)常使用指定線寬和線型的直線與弧線。欲產(chǎn)生具經(jīng)常使用指定線寬和線型的直線與弧線。欲產(chǎn)生具有寬度的線,可以順著掃描所生成的單像素線條軌有寬度的線,可

22、以順著掃描所生成的單像素線條軌跡跡, ,移動一把具有一定寬度的移動一把具有一定寬度的“刷子刷子”來獲得。來獲得?!八⑺⒆幼印钡男螤羁梢允且粭l線段或一個正方形。也可以的形狀可以是一條線段或一個正方形。也可以采用區(qū)域填充的辦法間接地產(chǎn)生有寬度的線。采用區(qū)域填充的辦法間接地產(chǎn)生有寬度的線。 線刷子的原理最簡單。假設(shè)直線斜率在線刷子的原理最簡單。假設(shè)直線斜率在1, 1之間,這時可以把刷子置成垂直方向,刷子的中點之間,這時可以把刷子置成垂直方向,刷子的中點對準(zhǔn)直線一端點,然后讓刷子中心往直線的另一端對準(zhǔn)直線一端點,然后讓刷子中心往直線的另一端移動,即可移動,即可“刷出刷出”具有一定寬度的線。具有一定寬度

23、的線。 當(dāng)直線斜率不在當(dāng)直線斜率不在1,1之間時,把刷子置成之間時,把刷子置成水平方向。具體實現(xiàn)線刷子時,只要對直線掃描水平方向。具體實現(xiàn)線刷子時,只要對直線掃描轉(zhuǎn)換算法的內(nèi)循環(huán)稍作修改。例如,當(dāng)直線斜率轉(zhuǎn)換算法的內(nèi)循環(huán)稍作修改。例如,當(dāng)直線斜率在在1, 1之間時,把每步迭代所得的點的上下方半之間時,把每步迭代所得的點的上下方半線寬之內(nèi)的像素全部置成直線顏色線寬之內(nèi)的像素全部置成直線顏色 若線寬為若線寬為5個像素,則把原來的個像素,則把原來的putpixel(x, y,color)語句擴(kuò)展為下列循環(huán)語句:語句擴(kuò)展為下列循環(huán)語句: for(i=-2;i=2;i+) putpixel (x,y+i

24、,color); 圖圖3.22所示為線寬是所示為線寬是5個像素的情形。算法簡個像素的情形。算法簡單、效率高是線刷子的優(yōu)點。但是,線的始末端單、效率高是線刷子的優(yōu)點。但是,線的始末端總是水平或垂直的。因此,當(dāng)線寬較大時,看起總是水平或垂直的。因此,當(dāng)線寬較大時,看起來很不自然。當(dāng)比較接近水平的線與比較接近垂來很不自然。當(dāng)比較接近水平的線與比較接近垂直的線匯合時,匯合處外均將有缺口。如圖直的線匯合時,匯合處外均將有缺口。如圖3.23所示。所示。 圖圖3.22 5個像素寬的線刷子個像素寬的線刷子圖圖3.23 線刷子的缺口線刷子的缺口 線刷子還會使斜線與水平(或垂直)線不一樣線刷子還會使斜線與水平(或

25、垂直)線不一樣粗。對于水平線或垂直線,刷子與線條垂直,因而粗。對于水平線或垂直線,刷子與線條垂直,因而最粗。其粗細(xì)與指定線寬相等。而對于最粗。其粗細(xì)與指定線寬相等。而對于45斜線,斜線,刷子與線條成刷子與線條成45角,粗細(xì)僅為指定線寬的角,粗細(xì)僅為指定線寬的0.7倍。倍。 為了生成有寬度的線,還可以用方形的刷子。為了生成有寬度的線,還可以用方形的刷子。把邊寬為指定線寬的正方形的中心沿直線作平行移把邊寬為指定線寬的正方形的中心沿直線作平行移動,即可獲得具有線寬的線條,如圖動,即可獲得具有線寬的線條,如圖3.24所示為用所示為用正方形刷子繪制的具有寬度的線條。比較圖正方形刷子繪制的具有寬度的線條。

26、比較圖3.24與與圖圖3.22可知,用方形刷子所得的線條比用線刷子所可知,用方形刷子所得的線條比用線刷子所繪制的線條要粗一些。繪制的線條要粗一些。線寬為線寬為5個像素的方刷子個像素的方刷子 與線刷子類似,用方刷子繪制的線條始未端也與線刷子類似,用方刷子繪制的線條始未端也是水平或垂直的,且線寬與線條方向有關(guān)。與線刷是水平或垂直的,且線寬與線條方向有關(guān)。與線刷子的情形相反,對于水平線與垂直線,線寬最小,子的情形相反,對于水平線與垂直線,線寬最小,而對于斜率為而對于斜率為1的線條,線寬最大,為垂直(水的線條,線寬最大,為垂直(水平)線寬度的平)線寬度的1.41倍。倍。 實現(xiàn)正方形刷子最簡單的辦法是,

27、把方形中心實現(xiàn)正方形刷子最簡單的辦法是,把方形中心對準(zhǔn)單像素寬的線條上各個像素,并把方形內(nèi)的像對準(zhǔn)單像素寬的線條上各個像素,并把方形內(nèi)的像素全部置成線條顏色。若線寬為素全部置成線條顏色。若線寬為5,則可把原來的,則可把原來的putpixel (x,y,color)語句改為下列語句組:語句改為下列語句組: for (i = 2; i=2; i+) for (j = 2; j =2; j+) putpixel (x+i, y+j, color); 這種簡單方法將會重復(fù)地寫像素。這是因為對這種簡單方法將會重復(fù)地寫像素。這是因為對應(yīng)于相鄰兩像素的方形一般會重疊。為了避免重復(fù)應(yīng)于相鄰兩像素的方形一般會重

28、疊。為了避免重復(fù)寫像素,可以采用與活化邊表類似的技術(shù)。為每條寫像素,可以采用與活化邊表類似的技術(shù)。為每條掃描線建一個表,存放該掃描線與線條的相交區(qū)間掃描線建一個表,存放該掃描線與線條的相交區(qū)間左右端點位置。在每個像素使用方形刷子時,用該左右端點位置。在每個像素使用方形刷子時,用該方形與各掃描線的相交區(qū)間端點坐標(biāo)去更新原表內(nèi)方形與各掃描線的相交區(qū)間端點坐標(biāo)去更新原表內(nèi)端點數(shù)據(jù)。端點數(shù)據(jù)。 生成具有寬度的線條還可以采用區(qū)域填充的算生成具有寬度的線條還可以采用區(qū)域填充的算法。先算出線條各角點,再用直線段把相鄰角點連法。先算出線條各角點,再用直線段把相鄰角點連接起來,最后調(diào)用多邊形填充算法把所得的四邊

29、形接起來,最后調(diào)用多邊形填充算法把所得的四邊形進(jìn)行填色,即得到具有寬度的線條。用這種方法還進(jìn)行填色,即得到具有寬度的線條。用這種方法還可以生成兩端粗細(xì)不一樣的線條??梢陨蓛啥舜旨?xì)不一樣的線條。 2、 圓弧線寬的處理圓弧線寬的處理 為了生成具有寬度的圓弧,可采用與直線情為了生成具有寬度的圓弧,可采用與直線情形類似的方法,當(dāng)采用線刷子時,在經(jīng)過曲線斜形類似的方法,當(dāng)采用線刷子時,在經(jīng)過曲線斜率為率為1的點時,必須把線刷子在水平與垂直方的點時,必須把線刷子在水平與垂直方向之間切換。由于線刷子總是置成水平或垂直的,向之間切換。由于線刷子總是置成水平或垂直的,所以在曲線接近水平與垂直的地方,線條更粗一

30、所以在曲線接近水平與垂直的地方,線條更粗一些,而在斜率接近些,而在斜率接近1的點附近,線條更細(xì)一些,的點附近,線條更細(xì)一些,如圖如圖(a)所示。所示。 當(dāng)采用正方形刷子時,無需改變刷子方向。只當(dāng)采用正方形刷子時,無需改變刷子方向。只需順著單像素寬的軌跡,把正方形中心對準(zhǔn)軌跡上需順著單像素寬的軌跡,把正方形中心對準(zhǔn)軌跡上的像素,把方形內(nèi)的像素全部用線條顏色填充。的像素,把方形內(nèi)的像素全部用線條顏色填充。(a)用線刷子繪制的圓弧用線刷子繪制的圓弧圖圖 圓弧的線寬圓弧的線寬 用正方形刷子繪制的曲線條,在接近水平與用正方形刷子繪制的曲線條,在接近水平與垂直的部分最細(xì),而在斜率為全垂直的部分最細(xì),而在斜率為全1的點附近最粗,的點附近最粗,這恰與線刷子情形相反,如圖這恰與線刷子情形相反,如圖(b)所示。所示。 (b)用方刷子繪制的圓弧用方刷子繪制的圓弧3、 線型的處理線型的處理 繪制具有寬度的圓弧線條也可以采用填充的辦繪制具有寬度的圓弧線條也可以采用填充的辦法,先繪制圓弧線條的內(nèi)邊界和外邊

溫馨提示

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

評論

0/150

提交評論