史 文 崇
(河北科技師范學院數(shù)學與信息科技學院,河北 秦皇島,066004)
許多圖形圖像處理軟件都有漸變填充功能,可輕松實現(xiàn)從線性漸變到放射漸變填充,就連文字處理軟件Word也有相應(yīng)功能。MATLAB作為優(yōu)秀的數(shù)學類軟件,具有杰出的圖形圖像處理功能,許多函數(shù)可用于色彩填充:fill函數(shù)用于常規(guī)二維圖形色彩填充,fill3函數(shù)用于立體圖形的色彩填充[1~3],patch函數(shù)既可用于二維圖形也可用于三維圖形色彩填充,而mesh,surf,sphere等函數(shù)可實現(xiàn)三維圖形曲面的色彩填充效果[4,5]。其中,用patch函數(shù)實現(xiàn)線性漸變填充極其簡單[6],但在使用過程中,不確定性很大,很難掌控。mesh,surf,sphere等函數(shù)會自動產(chǎn)生漸變色[7,8],而且在使用中因為視角、光線等參數(shù)對總體效果的影響,很少需要進一步設(shè)置色彩漸變填充效果;對于錐角漸變、放射漸變、路徑漸變等填充,MATLAB中也沒有專門的函數(shù)。要想達到理想的漸變填充效果需要獨辟蹊徑。
fill函數(shù)一般用于二維圖形的單色填充。要想實現(xiàn)漸變填充,一是填充區(qū)域要不斷改變,二是其色彩矩陣必須是變量。而要想實現(xiàn)線性漸變填充,就要使填充區(qū)域一直沿著某一個方向移動。這在循環(huán)程序中不難實現(xiàn),但要使?jié)u變填充效果達到平滑均勻,一是原始填充區(qū)域和移動幅度要足夠小,二是色彩的變化幅度要足夠小。還需注意,當利用fill函數(shù)填充一個圖形時,其色彩涉及填充區(qū)域顏色(facecolor)和外圍輪廓色(edgecolor)兩個屬性。忽略后一個屬性,或者后一個屬性值設(shè)置不當,都不會達到預(yù)期目的。一般會認為這兩個屬性應(yīng)采用不同的值,如果兩者的差值設(shè)置得當,效果會很完美。但鑒于輪廓線的寬度最小值和系統(tǒng)精度限制,實驗表明,這一思路往往難以達到預(yù)期目的。這里簡化操作,使輪廓色和填充色取相同的顏色值,以期獲得理想效果。
根據(jù)上述思路,首先考慮實現(xiàn)從左向右水平方向的線性漸變填充。構(gòu)建水平方向尺寸為0.01個單位,鉛垂方向為0.5個單位的微小矩形,在循環(huán)體內(nèi)每次向右平移0.01個單位。填充色變化幅度也為0.01。在100次循環(huán)中從黑色漸變?yōu)榘咨?。核心代碼如下:
x=[0,0,0.01,0.01];%微分矩形,寬度極小
y=[0,0.5,0.5,0]; %微分矩形,高度
hold on;%保持連續(xù)畫圖狀態(tài)
for i=0:100
c0=0.01*i; %填充色三元組隨循環(huán)變量變化,顏色值不斷增大
c=[c0,c0,c0];%填充色矩陣,初值黑色[0,0,0],終值白色[1,1,1]
fill(x,y,c,′edgecolor′,c);%填充色=輪廓色
x=x+0.01;%小矩形向右微量平移
end
執(zhí)行上述程序,得到圖1??梢妼崿F(xiàn)了非常理想的水平漸變(從較黑到較白)填充效果,充分驗證了這種漸變填充原理的正確性。實驗表明,輪廓色屬性值設(shè)為“none”,效果相同。如在循環(huán)開始前,通過input語句設(shè)置初始和終止色彩矩陣C1,C2,其值由用戶自行輸入,只要程序中c0,c,i變量作相應(yīng)調(diào)整,完全可以實現(xiàn)任意兩種色彩的漸變填充效果。
上例之所以實現(xiàn)了水平方向漸變填充效果,是因為最初的微小四邊形水平尺寸遠遠小于垂直尺寸。而且在執(zhí)行每一循環(huán)后不斷向右微量平移(x=x+0.01)。在程序中,如最初取x=[0,0,1,1];y=[1,1.01,1.01,1],在每執(zhí)行一次循環(huán)體后改變y矩陣,如y=y-0.01,則可以實現(xiàn)從上向下垂直線性漸變填充的效果。不僅如此,在循環(huán)中同時小幅度改變x和y矩陣,還可以實現(xiàn)類似圖2的斜向線性漸變的填充效果。由此可以肯定,只要微小矩形矩陣構(gòu)建、色彩矩陣變化幅度和x,y矩陣變化幅度設(shè)置科學合理,利用fill函數(shù)可以實現(xiàn)所有線性漸變填充效果。
圖1 矩形輪廓的線性漸變填充 圖2 斜向線性漸變填充效果
上述線性漸變填充原理絕非僅僅適應(yīng)于矩形或平行四邊形輪廓的漸變填充。只要初始微小四邊形設(shè)置得當,在后面的循環(huán)體中科學設(shè)置縱橫坐標的函數(shù)關(guān)系和位移幅度、色彩變化幅度,可填充曲線輪廓圖形。例如,要繪制圓心在(0,0)點,半徑為2的圓(x2+y2=4)內(nèi)從黑色到白色的線性漸變,核心代碼可為:
x=[-2,-1.98,-1.98,-2]; %微四邊形橫坐標初值
hold on;
for n=0:200
y0=sqrt(4-x.∧2); %求相應(yīng)的縱坐標
y=[y0(1),y0(2),-y0(3),-y0(4)];%微小四邊形縱坐標
c0=n*0.005;%三原色顏色值隨循環(huán)變量不斷增大
c=[c0,c0,c0]; %填充顏色值矩陣
fill(x,y,c,′edgecolor′,c);%填充色=輪廓色或′edgecolor′值為“none”
x=x+0.02; %小幅度向右平移
end
axis square;axis tight;
運行上述程序,可得到圖3。這里得到的只是平面圖形效果,但綜合運用可呈現(xiàn)立體效果,并具有實用價值。例如,在圖3的基礎(chǔ)上,再疊加一層線性漸變填充——相同圓心和較小半徑的圓(例如,x2+y2=1),沿平行于x軸的方向從左到右從白色到黑色的漸變填充,核心代碼可為:
xx=[-1,-0.98,-0.98,-1];
for m=0:100 %因半徑小,循環(huán)次數(shù)可減少
y0=sqrt(1-xx.∧2);
yx=[y0(1),y0(2),-y0(3),-y0(4)];
cx0=1-m*0.01;%從白到黑
cx=[cx0,cx0,cx0];
fill(xx,yx,cx,′edgecolor′, ′none′);
xx=xx+0.02;
end
運行上述程序,得到圖4??梢娨褜崿F(xiàn)類似圓形紐扣或按鈕的理想的立體效果。
圖3 曲線輪廓的線性漸變填充 圖4 線性漸變填充原理的綜合運用一例
在實際應(yīng)用中,正多邊形、星形、圓形往往不需要線性漸變填充,而更多的是錐角漸變、球面漸變填充。稍加分析不難發(fā)現(xiàn),正多邊形、星形、圓形這些圖形都是中心對稱圖形。無論向哪個方向平移都不可能實現(xiàn)錐角漸變或球形面漸變填充。這些漸變歸根結(jié)底屬于從邊緣向中心點的徑向縮放漸變,與線性漸變根本不同,不能用前面的fill填充原理實現(xiàn),只能靠合理安排縮放幅度來控制。用MATLAB繪出這些中心對稱圖形并不困難,而縮放主要靠半徑的漸變來實現(xiàn),而不是角度的改變。理論上,可以先繪制出這些中心對稱圖形,再在循環(huán)體中不斷改變半徑和填充(輪廓)色矩陣,即可實現(xiàn)錐角漸變或球面漸變效果。但Matlab中有scatter和plot函數(shù),可用于畫散點圖。而點的形狀(marker)可以是圓形、正三角型、正方形、五角星、六角形等,籍此完全可以省去編寫繪制中心對稱幾何圖形程序,模擬一些中心對稱圖形的漸變填充效果。持續(xù)畫圖時,點的坐標始終不變,而圖形大小、色彩(填充色和輪廓色)從大到小按均勻微小幅度變化,由于后產(chǎn)生的圖形將出現(xiàn)在先產(chǎn)生的圖形之上,最終必將呈現(xiàn)漸變填充效果。當然,同樣要借助循環(huán)語句實現(xiàn),關(guān)鍵是圖形大小和色彩值的變化幅度要足夠小,填充色和輪廓色保持一致?;谶@一思想,編寫如下代碼(色彩模式為RGB模式),可繪制三角形、正方形、五角星、圓形的漸變填充效果。例如,欲得到圖5所示球面漸變填充效果,程序核心代碼如下:
圖5 圓球的漸變填充
hold on; %持續(xù)畫圖
for i=100:-1:1 %點的大小變量
k=1-0.01*i; %色彩值相應(yīng)變化
h=plot(3,3, ′o′,′markersize′,i); %重疊畫點
%marker樣式可取s/p/h/∧/d等,得不同圖案
c=[k,k,k]; %三色彩值相等,灰度效果
set(h,′markerfacecolor′,c,′markeredgecolor′,c);
%填充色和輪廓色取相同值或后者為none
End
而要想繪制圖6的有立體感的紅五角星,可將上述代碼段核心部分修改為:
hold on;
for i=0:99
j=0.01*i;
h=plot(3,3, ′p′,′markersize′,100-i);
c=[1,j,j];
set(h,′markerfacecolor′,c,′markeredgecolor′,c)
end
圖6 五角星的漸變填充
不難看出,在程序中并未刻意考慮是哪類漸變,結(jié)果卻既有錐形漸變、也有球面(輻射)漸變??梢?,利用這一原理繪制徑向漸變效果圖案,漸變類型只取決于圖形的輪廓。這種徑向漸變技術(shù)用平面圖形逼真地模擬出了立體效果。
綜合運用這一漸變填充原理具有重要意義。例如,以3個半徑不等的同心圓互為填充邊界形成3個圓環(huán),最外圍沿徑向從黑到白漸變,中間圓環(huán)從外向內(nèi)沿圓心方向從白色到黑色漸變填充,中間圓形以純白色填充??傻玫綀D7的環(huán)狀效果。
圖7 徑向漸變填充應(yīng)用一例
線性漸變填充色彩改變方向為直線。錐形漸變或球面漸變填充色彩改變方向為徑向。但有時候需要的漸變方向既非直線也非徑向,路徑可能是一條曲線。要實現(xiàn)此類色彩漸變填充,必須尋求其他途徑。
在MATLAB中,填充函數(shù)fill(X,Y,C)的X,Y矩陣經(jīng)常包含y=f(x)類函數(shù)關(guān)系,可以認為該函數(shù)就是路徑函數(shù)或方向函數(shù)。當這種函數(shù)關(guān)系確定后,在色彩矩陣C控制得當時,利用線性漸變原理,即可實現(xiàn)路徑漸變填充效果。值得注意的是輪廓色和填充色設(shè)置原理與上文思路相同。
例如,對于兩個圓曲線x2+y2=22和x2+y2=42圍成的環(huán)形區(qū)域?qū)崿F(xiàn)漸變填充。x和y的函數(shù)關(guān)系可通過中間變量t利用極坐標間接地表示。填充色和輪廓色隨循環(huán)變量相應(yīng)設(shè)置。核心程序代碼可為:
hold on;
t1=0:0.001:pi/100; %外圓弧度變化范圍
t2=pi/100:-0.001:0; %內(nèi)圓弧度變化范圍
for n=1:200
x11=4*cos(t1); y11=4*sin(t1); %外圓坐標
x21=2*cos(t2); y21=2*sin(t2); %內(nèi)圓坐標
X=[x11 x21]; Y=[y11 y21]; %方位矩陣
C0=0.005*n;
C=[C0,C0,C0]; %填充色矩陣
F=fill(X,Y,C); %填充函數(shù)
set(F,′edgecolor′,C);%設(shè)置輪廓色
t1=t1+pi/100;
t2=t2+pi/100;
end
上述程序的執(zhí)行結(jié)果見圖8。可以看出,其色彩漸變的方向既非直線,亦非徑向,而是圓周曲線方向。其實,這一填充技法不局限于規(guī)則的圓環(huán)區(qū)域,漸變路徑也不局限于規(guī)則的圓周曲線。只要將2個閉合曲線的方程稍加改變,也可以實現(xiàn)不對稱環(huán)形的漸變填充效果。圖9實現(xiàn)了坐標方程x1=4.5*cos (t1),y1=3*sin (t1)的外橢圓和方程x2=1.5*cos (t2)+1,y2=2.2*sin (t2)-0.5的內(nèi)橢圓所包圍區(qū)域從黑色到白色的漸變填充??梢钥闯?,二者半徑和幾何中心并不相同,色彩漸變方向也非圓周曲線。
圖8 對稱圓環(huán)漸變填充效果 圖9 不對稱環(huán)形的漸變填充
這種漸變效果可用于平面廣告設(shè)計等領(lǐng)域。
在MATLAB中,通過fill函數(shù)、plot函數(shù)和循環(huán)語句可實現(xiàn)多種漸變填充效果。利用fill函數(shù)實現(xiàn)的關(guān)鍵是構(gòu)建微小四邊形,在循環(huán)中保持縱橫坐標值的函數(shù)關(guān)系,并不斷做微量平移,同時顏色值做微量改變;用plot函數(shù)實現(xiàn)的關(guān)鍵是在循環(huán)體中從大到小(變化幅度極小)在同一坐標點產(chǎn)生多個中心對稱圖形。二者都需要科學地構(gòu)建填充色彩矩陣,保證輪廓內(nèi)部填充色和輪廓線顏色一致。綜合運用這些填充原理,可得到具有實用價值的圖案,如用平面圖形模擬出理想的立體圖效果等。由于最終的漸變效果取決于輪廓的改變,在設(shè)計中,不必刻意考慮色彩漸變的類別或方向,而應(yīng)主要考慮圖形輪廓在循環(huán)中的改變規(guī)律。