在MATLAB中实现多种渐变填充效果

2020-03-11 01:29
河北科技师范学院学报 2020年4期
关键词:轮廓径向线性

史 文 崇

(河北科技师范学院数学与信息科技学院,河北 秦皇岛,066004)

许多图形图像处理软件都有渐变填充功能,可轻松实现从线性渐变到放射渐变填充,就连文字处理软件Word也有相应功能。MATLAB作为优秀的数学类软件,具有杰出的图形图像处理功能,许多函数可用于色彩填充:fill函数用于常规二维图形色彩填充,fill3函数用于立体图形的色彩填充[1~3],patch函数既可用于二维图形也可用于三维图形色彩填充,而mesh,surf,sphere等函数可实现三维图形曲面的色彩填充效果[4,5]。其中,用patch函数实现线性渐变填充极其简单[6],但在使用过程中,不确定性很大,很难掌控。mesh,surf,sphere等函数会自动产生渐变色[7,8],而且在使用中因为视角、光线等参数对总体效果的影响,很少需要进一步设置色彩渐变填充效果;对于锥角渐变、放射渐变、路径渐变等填充,MATLAB中也没有专门的函数。要想达到理想的渐变填充效果需要独辟蹊径。

1 线性渐变填充

1.1 水平方向线性渐变填充

fill函数一般用于二维图形的单色填充。要想实现渐变填充,一是填充区域要不断改变,二是其色彩矩阵必须是变量。而要想实现线性渐变填充,就要使填充区域一直沿着某一个方向移动。这在循环程序中不难实现,但要使渐变填充效果达到平滑均匀,一是原始填充区域和移动幅度要足够小,二是色彩的变化幅度要足够小。还需注意,当利用fill函数填充一个图形时,其色彩涉及填充区域颜色(facecolor)和外围轮廓色(edgecolor)两个属性。忽略后一个属性,或者后一个属性值设置不当,都不会达到预期目的。一般会认为这两个属性应采用不同的值,如果两者的差值设置得当,效果会很完美。但鉴于轮廓线的宽度最小值和系统精度限制,实验表明,这一思路往往难以达到预期目的。这里简化操作,使轮廓色和填充色取相同的颜色值,以期获得理想效果。

根据上述思路,首先考虑实现从左向右水平方向的线性渐变填充。构建水平方向尺寸为0.01个单位,铅垂方向为0.5个单位的微小矩形,在循环体内每次向右平移0.01个单位。填充色变化幅度也为0.01。在100次循环中从黑色渐变为白色。核心代码如下:

x=[0,0,0.01,0.01];%微分矩形,宽度极小

y=[0,0.5,0.5,0]; %微分矩形,高度

hold on;%保持连续画图状态

for i=0:100

c0=0.01*i; %填充色三元组随循环变量变化,颜色值不断增大

c=[c0,c0,c0];%填充色矩阵,初值黑色[0,0,0],终值白色[1,1,1]

fill(x,y,c,′edgecolor′,c);%填充色=轮廓色

x=x+0.01;%小矩形向右微量平移

end

执行上述程序,得到图1。可见实现了非常理想的水平渐变(从较黑到较白)填充效果,充分验证了这种渐变填充原理的正确性。实验表明,轮廓色属性值设为“none”,效果相同。如在循环开始前,通过input语句设置初始和终止色彩矩阵C1,C2,其值由用户自行输入,只要程序中c0,c,i变量作相应调整,完全可以实现任意两种色彩的渐变填充效果。

1.2 垂直渐变与斜角渐变

上例之所以实现了水平方向渐变填充效果,是因为最初的微小四边形水平尺寸远远小于垂直尺寸。而且在执行每一循环后不断向右微量平移(x=x+0.01)。在程序中,如最初取x=[0,0,1,1];y=[1,1.01,1.01,1],在每执行一次循环体后改变y矩阵,如y=y-0.01,则可以实现从上向下垂直线性渐变填充的效果。不仅如此,在循环中同时小幅度改变x和y矩阵,还可以实现类似图2的斜向线性渐变的填充效果。由此可以肯定,只要微小矩形矩阵构建、色彩矩阵变化幅度和x,y矩阵变化幅度设置科学合理,利用fill函数可以实现所有线性渐变填充效果。

图1 矩形轮廓的线性渐变填充 图2 斜向线性渐变填充效果

1.3 线性渐变填充原理的综合应用

上述线性渐变填充原理绝非仅仅适应于矩形或平行四边形轮廓的渐变填充。只要初始微小四边形设置得当,在后面的循环体中科学设置纵横坐标的函数关系和位移幅度、色彩变化幅度,可填充曲线轮廓图形。例如,要绘制圆心在(0,0)点,半径为2的圆(x2+y2=4)内从黑色到白色的线性渐变,核心代码可为:

x=[-2,-1.98,-1.98,-2]; %微四边形横坐标初值

hold on;

for n=0:200

y0=sqrt(4-x.∧2); %求相应的纵坐标

y=[y0(1),y0(2),-y0(3),-y0(4)];%微小四边形纵坐标

c0=n*0.005;%三原色颜色值随循环变量不断增大

c=[c0,c0,c0]; %填充颜色值矩阵

fill(x,y,c,′edgecolor′,c);%填充色=轮廓色或′edgecolor′值为“none”

x=x+0.02; %小幅度向右平移

end

axis square;axis tight;

运行上述程序,可得到图3。这里得到的只是平面图形效果,但综合运用可呈现立体效果,并具有实用价值。例如,在图3的基础上,再叠加一层线性渐变填充——相同圆心和较小半径的圆(例如,x2+y2=1),沿平行于x轴的方向从左到右从白色到黑色的渐变填充,核心代码可为:

xx=[-1,-0.98,-0.98,-1];

for m=0:100 %因半径小,循环次数可减少

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。可见已实现类似圆形纽扣或按钮的理想的立体效果。

图3 曲线轮廓的线性渐变填充 图4 线性渐变填充原理的综合运用一例

2 径向渐变——锥形渐变与辐射渐变

2.1 实现径向渐变填充的基本思路

在实际应用中,正多边形、星形、圆形往往不需要线性渐变填充,而更多的是锥角渐变、球面渐变填充。稍加分析不难发现,正多边形、星形、圆形这些图形都是中心对称图形。无论向哪个方向平移都不可能实现锥角渐变或球形面渐变填充。这些渐变归根结底属于从边缘向中心点的径向缩放渐变,与线性渐变根本不同,不能用前面的fill填充原理实现,只能靠合理安排缩放幅度来控制。用MATLAB绘出这些中心对称图形并不困难,而缩放主要靠半径的渐变来实现,而不是角度的改变。理论上,可以先绘制出这些中心对称图形,再在循环体中不断改变半径和填充(轮廓)色矩阵,即可实现锥角渐变或球面渐变效果。但Matlab中有scatter和plot函数,可用于画散点图。而点的形状(marker)可以是圆形、正三角型、正方形、五角星、六角形等,籍此完全可以省去编写绘制中心对称几何图形程序,模拟一些中心对称图形的渐变填充效果。持续画图时,点的坐标始终不变,而图形大小、色彩(填充色和轮廓色)从大到小按均匀微小幅度变化,由于后产生的图形将出现在先产生的图形之上,最终必将呈现渐变填充效果。当然,同样要借助循环语句实现,关键是图形大小和色彩值的变化幅度要足够小,填充色和轮廓色保持一致。基于这一思想,编写如下代码(色彩模式为RGB模式),可绘制三角形、正方形、五角星、圆形的渐变填充效果。例如,欲得到图5所示球面渐变填充效果,程序核心代码如下:

图5 圆球的渐变填充

hold on; %持续画图

for i=100:-1:1 %点的大小变量

k=1-0.01*i; %色彩值相应变化

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 五角星的渐变填充

不难看出,在程序中并未刻意考虑是哪类渐变,结果却既有锥形渐变、也有球面(辐射)渐变。可见,利用这一原理绘制径向渐变效果图案,渐变类型只取决于图形的轮廓。这种径向渐变技术用平面图形逼真地模拟出了立体效果。

2.2 径向渐变填充原理的综合运用

综合运用这一渐变填充原理具有重要意义。例如,以3个半径不等的同心圆互为填充边界形成3个圆环,最外围沿径向从黑到白渐变,中间圆环从外向内沿圆心方向从白色到黑色渐变填充,中间圆形以纯白色填充。可得到图7的环状效果。

图7 径向渐变填充应用一例

3 路径渐变填充

线性渐变填充色彩改变方向为直线。锥形渐变或球面渐变填充色彩改变方向为径向。但有时候需要的渐变方向既非直线也非径向,路径可能是一条曲线。要实现此类色彩渐变填充,必须寻求其他途径。

在MATLAB中,填充函数fill(X,Y,C)的X,Y矩阵经常包含y=f(x)类函数关系,可以认为该函数就是路径函数或方向函数。当这种函数关系确定后,在色彩矩阵C控制得当时,利用线性渐变原理,即可实现路径渐变填充效果。值得注意的是轮廓色和填充色设置原理与上文思路相同。

例如,对于两个圆曲线x2+y2=22和x2+y2=42围成的环形区域实现渐变填充。x和y的函数关系可通过中间变量t利用极坐标间接地表示。填充色和轮廓色随循环变量相应设置。核心程序代码可为:

hold on;

t1=0:0.001:pi/100; %外圆弧度变化范围

t2=pi/100:-0.001:0; %内圆弧度变化范围

for n=1:200

x11=4*cos(t1); y11=4*sin(t1); %外圆坐标

x21=2*cos(t2); y21=2*sin(t2); %内圆坐标

X=[x11 x21]; Y=[y11 y21]; %方位矩阵

C0=0.005*n;

C=[C0,C0,C0]; %填充色矩阵

F=fill(X,Y,C); %填充函数

set(F,′edgecolor′,C);%设置轮廓色

t1=t1+pi/100;

t2=t2+pi/100;

end

上述程序的执行结果见图8。可以看出,其色彩渐变的方向既非直线,亦非径向,而是圆周曲线方向。其实,这一填充技法不局限于规则的圆环区域,渐变路径也不局限于规则的圆周曲线。只要将2个闭合曲线的方程稍加改变,也可以实现不对称环形的渐变填充效果。图9实现了坐标方程x1=4.5*cos (t1),y1=3*sin (t1)的外椭圆和方程x2=1.5*cos (t2)+1,y2=2.2*sin (t2)-0.5的内椭圆所包围区域从黑色到白色的渐变填充。可以看出,二者半径和几何中心并不相同,色彩渐变方向也非圆周曲线。

图8 对称圆环渐变填充效果 图9 不对称环形的渐变填充

这种渐变效果可用于平面广告设计等领域。

4 结 论

在MATLAB中,通过fill函数、plot函数和循环语句可实现多种渐变填充效果。利用fill函数实现的关键是构建微小四边形,在循环中保持纵横坐标值的函数关系,并不断做微量平移,同时颜色值做微量改变;用plot函数实现的关键是在循环体中从大到小(变化幅度极小)在同一坐标点产生多个中心对称图形。二者都需要科学地构建填充色彩矩阵,保证轮廓内部填充色和轮廓线颜色一致。综合运用这些填充原理,可得到具有实用价值的图案,如用平面图形模拟出理想的立体图效果等。由于最终的渐变效果取决于轮廓的改变,在设计中,不必刻意考虑色彩渐变的类别或方向,而应主要考虑图形轮廓在循环中的改变规律。

猜你喜欢
轮廓径向线性
浅探径向连接体的圆周运动
双级径向旋流器对燃烧性能的影响
线性回归方程的求解与应用
OPENCV轮廓识别研究与实践
二阶线性微分方程的解法
非齐次线性微分方程的常数变易法
ℝN上带Hardy项的拟线性椭圆方程两个解的存在性
新型非接触式径向C4D传感器优化设计
一种可承受径向和轴向载荷的超声悬浮轴承
高速公路主动发光轮廓标应用方案设计探讨