搞气氛!用MATLAB画一棵Bling Bling的圣诞树

0.前言

圣诞节了,今天推一篇用MATLAB画圣诞树的,效果如下图所示:


chris.gif

1.准备工作

因为这次用的是MATLAB,不像PYTHON一样需要装一些依赖库,要实现本文的效果,只需安装MATLAB即可。

2.动起手来

2.1 画树

要画圣诞树,首先...画棵树,然后再想办法来点缀它。

close all;clear;clc
% setup
snow=450;    % number of snow flakes [0 .. 5000]
% draw tree
h=0:0.2:25; %vertical grid
[X,Y,Z] = cylinder(tree(h)); %produce a tree formed cylinder
Z=Z*25; %scale to the right heigth
%Add some diffusion to the surface of the tree to make it look more real
treeDiffusion=rand(126,21)-0.5;%some horizontal diffusion data
%add diffusion to the grid points
for cnt1=1:21    
    for cnt2=16:126%starting above the trunk
        %get the angle to always diffuse in direction of the radius
        angle=atan(Y(cnt2,cnt1)/X(cnt2,cnt1));
        %split the diffusion in the two coordinates, depending on the angle
        X(cnt2,cnt1)=X(cnt2,cnt1)+cos(angle)*treeDiffusion(cnt2,cnt1);
        Y(cnt2,cnt1)=Y(cnt2,cnt1)+sin(angle)*treeDiffusion(cnt2,cnt1);
        %some Vertical diffusion for each point
        Z(cnt2,cnt1)=Z(cnt2,cnt1)+(rand-0.5)*0.5;
    end    
end
%draw the tree
h0  = figure('Units','inches');
pos = h0.Position;
pos(1) = 1; pos(2) = 1;
pos(3) = 7; pos(4) = 7;
h0.Position = pos;
surfl(X,Y,Z,'light')

em...这图看上去似乎有点不可言说的美....


tree.jpg

2.2 服道化

下一步,给树打个光,填个色,角度调整一下来点三维效果,把坐标系显示去掉,然后一棵绿油油的树就出现了。

%Use as nice green color map (darker at the bottom, lighter at the top)
r=(0.0430:(0.2061/50):0.2491)';%red component
g=(0.2969:(0.4012/50):0.6981)';%green component
b=(0.0625:(0.2696/50):0.3321)';%blue component
map=[r,g,b];%join in a map
for cnt=1:6
    %change the lower part to brown for the trunk
    map(cnt,:)=[77,63,5]/265;
end
colormap(map)%set the map
view([-37.5,4])%Change the view to see a little more of the Actual 3D tree
lighting phong %some nice lighting
shading interp %remove grid and smoothen the surface color
axis equal %takes care of display in the right proportion
axis([-10 10 -10 10 0 30]) %give some more axis space (for the snow later)
axis off %but don't show axis
hold on %to draw the rest
title('Merry Christmas','color','w',...
    'fontsize',25,...
    'fontweight','Bold')

接下来,把图像底色调一下,用一个五彩斑斓的黑加点星空蓝当背景(此处在某甲方选手不断提出色彩需求后最终确定的颜色,致谢!)
然后再摆几个小礼物盒子在树下,这过节气氛杠杠的。



set(gcf,'color',[22 32 51]./255)
% Presents
%Draw some presents around the tree (each with random color)
drawPresent(2,-4,0,3,3,2);
drawPresent(-4,3,0,2,3,1.5);
drawPresent(5,3,0,4,3,3);
drawPresent(-14,-5,0,6,3,1);
drawPresent(-9,-10,0,2,2,2);
drawPresent(0,4,0,4,3,3);
drawPresent(-6,-13,0,3,3,3);

2.3 雪花飘飘

最后,关键部分,撒点雪花,再画点彩灯到图上,调整三维图像的角度,来点动画效果,结束战斗!


chris.jpg
% Snow
%create some random 3D coordinates for the snow (amount as in setup above)
snowX=(rand(snow-100,1)*25-12.5);
snowY=(rand(snow-100,1)*25-12.5);
snowZ=(rand(snow-100,1)*27);
color0 = jet(length(snowX));
%Note:Some flakes will end up IN the tree but just can't be seen then
for ii = 1:length(snowX)
   plot3(snowX(ii),snowY(ii),snowZ(ii),'*','color',color0(ii, :),'markersize',randi(15))%plot coordinates as white snow flakes
   %     plot3(snowX(ii),snowY(ii),snowZ(ii),'*','color',color0(ii, :))%plot coordinates as white snow flakes
end
h=plot3(snowX,snowY,snowZ,'w*');
im = {};
for ii = 1:180
   if mod(ii,3) == 0
       h.Visible = 'off';
       snowX=(rand(snow,1)*25-12.5);
       snowY=(rand(snow,1)*25-12.5);
       snowZ=(rand(snow,1)*27);
       h=plot3(snowX,snowY,snowZ,'w*');
       %         pause(0.25)
   else
       view([ii,4])
       %         pause(0.1)
   end
   if ii > 85
       frame = getframe(gcf);
       im{ii} = frame2im(frame);
   end
end
hold off%Done

2.4 输出gif文件

此处有知识点!敲黑板!!如何清除cell数组中的空元素。

im(cellfun(@isempty,im))=[];
file2write = 'chris.gif';
for ii = 1:length(im)
    [A, map] = rgb2ind( im{ii}, 256);
    if ii == 1
        imwrite(A, map, file2write, 'gif','LoopCount',Inf,'DelayTime', 0.12);
    else
        imwrite(A, map, file2write, 'gif','WriteMode','append','DelayTime', 0.12);
    end
end

3.结论

大功告成。
用MATLAB实现一个Bling Bling的圣诞树,祝大家玩得开心。


chris.gif

关注公众号 海洋纪 ,后台回复 圣诞快乐 可获取代码。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容