fig=figure('Units','normalized','Position',[.1,.05,.4,.8]);
ax=axes(fig);
hold(ax,'on');
ax.XTick=[];
ax.YTick=[];
ax.XColor='none';
ax.YColor='none';
ax.XLim=[0,600];
ax.YLim=[0,800];
ax.DataAspectRatio=[1 1 1];
ax.Color=[109,128,205]./255;
drawMist() % 绘制雾气
drawMandS() % 绘制星星和月亮
drawMountains() % 绘制山脉和雪地
drawXMasTree() % 绘制圣诞树
% 雾气绘制函数
function drawMist()
colMist=[181,137,190]./255;
a=500;b=(.5:a)'/a;
c=(-cos(b*2*pi)+1).^.2;
f=b-.5;r=f'.^2+f.^2;
% 二维柏林式噪声生成
alp=abs(ifftn(exp(3i*rand(a))./r.^.8)).*(c*c');
alp=alp./max(alp,[],'all');
CMesh=zeros([size(alp),3]);
CMesh(:,:,1)=colMist(1);
CMesh(:,:,2)=colMist(2);
CMesh(:,:,3)=colMist(3);
% 越向上、雾气越透明
dy=(500:-1:1)./500.*.8+.2;
image([0,600],[200,800],CMesh,'AlphaData',alp.*(dy'));
end
绘制效果:
% 星星月亮绘制函数
function drawMandS()
% 绘制双层圆形当月亮
t=0:pi/500:2*pi;
fill(cos(t).*25+450,sin(t).*25+670,[236,235,253]./255,'EdgeColor','none')
fill(cos(t).*30+450,sin(t).*30+670,[236,235,253]./255,'EdgeColor','none','FaceAlpha',.3)
% 绘制散点当星星
scatter(randi([0,600],[15,1]),randi([200,800],[15,1]),4,'filled',...
'CData',[1 1 1],'MarkerFaceAlpha',.6);
end
绘制效果:
% 山峰绘制函数
function drawMountains()
% 绘制山峰- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
colFurther=[240 34 75]; % 远山的颜色
colCloser=[219 43 60]; % 近山的颜色
a=800;b=(.5:a)'/a;
c=(-cos(b*2*pi)+1).^.2;
f=b-.5;r=f'.^2+f.^2;
% 8层山
for i=1:8
% 每次都生成一次二维柏林式噪声,并取其中一行的数据
h=abs(ifftn(exp(5i*rand(a))./r.^1.05)).*(c*c').*10;
nh=(8-i)*30+h(400,:)+180;
hm=ceil(max(nh));
CMesh=zeros([hm,800,3]);
% 颜色矩阵构造,
tcol=colFurther+(colCloser-colFurther)./8.*(i);
tcol=hsv2rgb(tcol./[360,100,100]);
CMesh(:,:,1)=tcol(1);
CMesh(:,:,2)=tcol(2);
CMesh(:,:,3)=tcol(3);
% 用nan数值框出山的轮廓
alp=ones(hm,800);
alp((1:hm)'>nh)=nan;
% 绘制山峰
image([-50,650],[0,hm],CMesh,'AlphaData',alp.*0.98);
end
% 画个雪地- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
nh=h(800,:);
fill([linspace(0,600,length(nh)),600,0],[nh./1.5+140,0,0],[218,222,234]./255,...
'EdgeColor','none')
% 雪地附近雾气- - - - - - - - - - - - - - - - - - - - - - - - - - -
colMist=[155,172,198]./255.*1.2;
a=500;b=(.5:a)'/a;
c=(-cos(b*2*pi)+1).^.2;
f=b-.5;r=f'.^2+f.^2;
% 二维柏林式噪声生成
alp=abs(ifftn(exp(3i*rand(a))./r.^.8)).*(c*c');
alp=alp./max(alp,[],'all');
CMesh=zeros([size(alp),3]);
CMesh(:,:,1)=colMist(1);
CMesh(:,:,2)=colMist(2);
CMesh(:,:,3)=colMist(3);
% 越向上、雾气越透明
dy=(500:-1:1)./500.*.6+.2;
image([0,600],[0,300],CMesh,'AlphaData',alp.*(dy'));
end
绘制效果:
% 圣诞树绘制函数
function drawXMasTree()
% 绘制树干- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
c=zeros(1,4,3);
c(1,1:2,1)=163./255;c(1,1:2,2)=165./255;c(1,1:2,3)=183./255;
c(1,3:4,1)=85./255 ;c(1,3:4,2)=95./255 ;c(1,3:4,3)=130./255;
patch([283,317,317,283],[100,100,180,180],c,'FaceColor','interp','EdgeColor','none')
fill([283:317,317,283],[100+rand(1,35).*10,90,90],[207,217,235]./255,'EdgeColor','none')
% 绘制树干粗糙花纹- - - - - - - - - - - - - - - - - - - - - - - - -
a=400;b=(.5:a)'/a;
c=(-cos(b*2*pi)+1).^.2;
f=b-.5;r=f'.^2+f.^2;
alp=abs(ifftn(exp(3i*rand(a))./r.^.8)).*(c*c');
alp=alp./max(alp,[],'all');
alp=alp(1:100,:);
colTrunk=[160,162,177]./255;
CMesh=zeros([size(alp),3]);
CMesh(:,:,1)=colTrunk(1);
CMesh(:,:,2)=colTrunk(2);
CMesh(:,:,3)=colTrunk(3);
dy=(100:-1:1)./100.*.8+.2;
image([283,317],[100,180],CMesh,'AlphaData',alp.*(dy'));
% 绘制树叶- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
colTree=[64,88,124]./255;
a=100;b=(.5:a)'/a;
c=(-cos(b*2*pi)+1).^.2;
f=b-.5;r=f'.^2+f.^2;
CMesh=zeros([a,a,3]);
CMesh(:,:,1)=colTree(1);
CMesh(:,:,2)=colTree(2);
CMesh(:,:,3)=colTree(3);
jList=[1,2,3,5,6,8,10,12,14,16,16,18,18,20,20,24,24,26,26,28,...
28,30,30,32,32,32,32,34,32,32,30,26,26,20];
for i=1:34
% 二维柏林式噪声生成
alp=abs(ifftn(exp(7i*rand(a))./r.^.9)).*(c*c');
alp=alp./max(alp,[],'all');
alp(alp=.5)=.7;
for j=(1:jList(i))-jList(i)/2
image([270,330]+j*6+(rand(1)-.5).*6,...
[200,260]+400-i*13+(rand(1)-.5).*3,CMesh,'AlphaData',alp);
end
end
% 绘制五角星- - - - - - - - - - - - - - - - - - - - - - - - - - - -
t=linspace(pi/2,2*pi+pi/2,11);
l=ones(1,11);l(2:2:11)=.47;
fill(cos(t).*26.*l+306,sin(t).*26.*l+640,[237,231,183]./255,...
'EdgeColor','none','FaceAlpha',.9)
% 绘制其他装饰物- - - - - - - - - - - - - - - - - - - - - - - - - -
% 绘制彩带
siny=-abs(sin(linspace(0,2.3*pi,100)))-linspace(0,2,100);
plot(linspace(200,400,100),siny.*20+300,'Color',[198,137,159]./255,'LineWidth',2)
siny=-abs(sin([linspace(0,pi,100),linspace(0,pi,40)]))-linspace(0,-5,140);
plot(linspace(220,380,140),siny.*20+330,'Color',[198,137,159]./255,'LineWidth',2)
siny=-abs(sin(linspace(0,1.2*pi,100)))-linspace(0,1.6,100);
plot(linspace(260,350,100),siny.*20+520,'Color',[198,137,159]./255,'LineWidth',2)
% 绘制装饰圆球
scatter([-50,20,20,50]+300,[-80,-25,70,-160]+400,50,'filled','CData',[152,173,176]./255);
scatter([-45,0,20,-60]+300,[110,30,140,-160]+400,50,'filled','CData',[109,133,212]./255);
scatter([-30,70]+300,[90,-180]+400,50,'filled','CData',[203,202,181]./255);
end
绘制效果:
function XmasTree
fig=figure('Units','normalized','Position',[.1,.05,.4,.8]);
ax=axes(fig);
hold(ax,'on');
ax.XTick=[];
ax.YTick=[];
ax.XColor='none';
ax.YColor='none';
ax.XLim=[0,600];
ax.YLim=[0,800];
ax.DataAspectRatio=[1 1 1];
ax.Color=[109,128,205]./255;
drawMist() % 绘制雾气
drawMandS() % 绘制星星和月亮
drawMountains() % 绘制山脉和雪地
drawXMasTree() % 绘制圣诞树
% =========================================================================
% 雾气绘制函数
function drawMist()
colMist=[181,137,190]./255;
a=500;b=(.5:a)'/a;
c=(-cos(b*2*pi)+1).^.2;
f=b-.5;r=f'.^2+f.^2;
% 二维柏林式噪声生成
alp=abs(ifftn(exp(3i*rand(a))./r.^.8)).*(c*c');
alp=alp./max(alp,[],'all');
CMesh=zeros([size(alp),3]);
CMesh(:,:,1)=colMist(1);
CMesh(:,:,2)=colMist(2);
CMesh(:,:,3)=colMist(3);
% 越向上、雾气越透明
dy=(500:-1:1)./500.*.8+.2;
image([0,600],[200,800],CMesh,'AlphaData',alp.*(dy'));
end
% -------------------------------------------------------------------------
% 星星月亮绘制函数
function drawMandS()
% 绘制双层圆形当月亮
t=0:pi/500:2*pi;
fill(cos(t).*25+450,sin(t).*25+670,[236,235,253]./255,'EdgeColor','none')
fill(cos(t).*30+450,sin(t).*30+670,[236,235,253]./255,'EdgeColor','none','FaceAlpha',.3)
% 绘制散点当星星
scatter(randi([0,600],[15,1]),randi([200,800],[15,1]),4,'filled',...
'CData',[1 1 1],'MarkerFaceAlpha',.6);
end
% -------------------------------------------------------------------------
% 圣诞树绘制函数
function drawXMasTree()
% 绘制树干- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
c=zeros(1,4,3);
c(1,1:2,1)=163./255;c(1,1:2,2)=165./255;c(1,1:2,3)=183./255;
c(1,3:4,1)=85./255 ;c(1,3:4,2)=95./255 ;c(1,3:4,3)=130./255;
patch([283,317,317,283],[100,100,180,180],c,'FaceColor','interp','EdgeColor','none')
fill([283:317,317,283],[100+rand(1,35).*10,90,90],[207,217,235]./255,'EdgeColor','none')
% 绘制树干粗糙花纹- - - - - - - - - - - - - - - - - - - - - - - - -
a=400;b=(.5:a)'/a;
c=(-cos(b*2*pi)+1).^.2;
f=b-.5;r=f'.^2+f.^2;
alp=abs(ifftn(exp(3i*rand(a))./r.^.8)).*(c*c');
alp=alp./max(alp,[],'all');
alp=alp(1:100,:);
colTrunk=[160,162,177]./255;
CMesh=zeros([size(alp),3]);
CMesh(:,:,1)=colTrunk(1);
CMesh(:,:,2)=colTrunk(2);
CMesh(:,:,3)=colTrunk(3);
dy=(100:-1:1)./100.*.8+.2;
image([283,317],[100,180],CMesh,'AlphaData',alp.*(dy'));
% 绘制树叶- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
colTree=[64,88,124]./255;
a=100;b=(.5:a)'/a;
c=(-cos(b*2*pi)+1).^.2;
f=b-.5;r=f'.^2+f.^2;
CMesh=zeros([a,a,3]);
CMesh(:,:,1)=colTree(1);
CMesh(:,:,2)=colTree(2);
CMesh(:,:,3)=colTree(3);
jList=[1,2,3,5,6,8,10,12,14,16,16,18,18,20,20,24,24,26,26,28,...
28,30,30,32,32,32,32,34,32,32,30,26,26,20];
for i=1:34
% 二维柏林式噪声生成
alp=abs(ifftn(exp(7i*rand(a))./r.^.9)).*(c*c');
alp=alp./max(alp,[],'all');
alp(alp=.5)=.7;
for j=(1:jList(i))-jList(i)/2
image([270,330]+j*6+(rand(1)-.5).*6,...
[200,260]+400-i*13+(rand(1)-.5).*3,CMesh,'AlphaData',alp);
end
end
% 绘制五角星- - - - - - - - - - - - - - - - - - - - - - - - - - - -
t=linspace(pi/2,2*pi+pi/2,11);
l=ones(1,11);l(2:2:11)=.47;
fill(cos(t).*26.*l+306,sin(t).*26.*l+640,[237,231,183]./255,...
'EdgeColor','none','FaceAlpha',.9)
% 绘制其他装饰物- - - - - - - - - - - - - - - - - - - - - - - - - -
% 绘制彩带
siny=-abs(sin(linspace(0,2.3*pi,100)))-linspace(0,2,100);
plot(linspace(200,400,100),siny.*20+300,'Color',[198,137,159]./255,'LineWidth',2)
siny=-abs(sin([linspace(0,pi,100),linspace(0,pi,40)]))-linspace(0,-5,140);
plot(linspace(220,380,140),siny.*20+330,'Color',[198,137,159]./255,'LineWidth',2)
siny=-abs(sin(linspace(0,1.2*pi,100)))-linspace(0,1.6,100);
plot(linspace(260,350,100),siny.*20+520,'Color',[198,137,159]./255,'LineWidth',2)
% 绘制装饰圆球
scatter([-50,20,20,50]+300,[-80,-25,70,-160]+400,50,'filled','CData',[152,173,176]./255);
scatter([-45,0,20,-60]+300,[110,30,140,-160]+400,50,'filled','CData',[109,133,212]./255);
scatter([-30,70]+300,[90,-180]+400,50,'filled','CData',[203,202,181]./255);
end
% -------------------------------------------------------------------------
% 山峰绘制函数
function drawMountains()
% 绘制山峰- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
colFurther=[240 34 75]; % 远山的颜色
colCloser=[219 43 60]; % 近山的颜色
a=800;b=(.5:a)'/a;
c=(-cos(b*2*pi)+1).^.2;
f=b-.5;r=f'.^2+f.^2;
% 8层山
for i=1:8
% 每次都生成一次二维柏林式噪声,并取其中一行的数据
h=abs(ifftn(exp(5i*rand(a))./r.^1.05)).*(c*c').*10;
nh=(8-i)*30+h(400,:)+180;
hm=ceil(max(nh));
CMesh=zeros([hm,800,3]);
% 颜色矩阵构造,
tcol=colFurther+(colCloser-colFurther)./8.*(i);
tcol=hsv2rgb(tcol./[360,100,100]);
CMesh(:,:,1)=tcol(1);
CMesh(:,:,2)=tcol(2);
CMesh(:,:,3)=tcol(3);
% 用nan数值框出山的轮廓
alp=ones(hm,800);
alp((1:hm)'>nh)=nan;
% 绘制山峰
image([-50,650],[0,hm],CMesh,'AlphaData',alp.*0.98);
end
% 画个雪地- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
nh=h(800,:);
fill([linspace(0,600,length(nh)),600,0],[nh./1.5+140,0,0],[218,222,234]./255,...
'EdgeColor','none')
% 雪地附近雾气- - - - - - - - - - - - - - - - - - - - - - - - - - -
colMist=[155,172,198]./255.*1.2;
a=500;b=(.5:a)'/a;
c=(-cos(b*2*pi)+1).^.2;
f=b-.5;r=f'.^2+f.^2;
% 二维柏林式噪声生成
alp=abs(ifftn(exp(3i*rand(a))./r.^.8)).*(c*c');
alp=alp./max(alp,[],'all');
CMesh=zeros([size(alp),3]);
CMesh(:,:,1)=colMist(1);
CMesh(:,:,2)=colMist(2);
CMesh(:,:,3)=colMist(3);
% 越向上、雾气越透明
dy=(500:-1:1)./500.*.6+.2;
image([0,600],[0,300],CMesh,'AlphaData',alp.*(dy'));
end
end