中秋节还有三天就到了,中秋节啊,阖家团圆的日子,又有多少人去摆弄电脑甚至打开MATLAB?因此要发就现在!

绘制效果

月饼绘制,立体月饼绘制,月饼状统计图往年我都已经画过了,那么今年不妨从月亮下手,两个动态绘图奉上。

《山间秋月》

在好久之前看到童晶老师Python趣味创意编程一书中有一山水绘制示例非常惊艳,但用了一些python中有matlab中没有的函数,一时手痒就改了个MATLAB版:

function landScape
% python出处:童晶|《Python趣味创意编程》
% MATLAB代码改写:slandarer% axes设置
ax=gca;
ax.XTick=[];
ax.YTick=[];
ax.XLim=[0,800];
ax.YLim=[0,600];
ax.DataAspectRatio=[1 1 1];
hold(ax,'on');
% =========================================================================
% 颜色预定义,注意此处是hsv格式
cClouds=[330,25,100];  % 云的颜色
cSky=[220,50,50];      % 天空的颜色
cFurther=[230,25,90];  % 远山的颜色
cCloser=[210,70,10];   % 近山的颜色
% =========================================================================
% 绘图函数调用
ax.Color=hsv2rgb(cFurther./[360,100,100]); % 背景为远山的颜色
drawSky(cSky,cFurther)                     % 画出天空颜色渐变效果
drawClouds(cClouds)                        % 画出彩色云朵效果
drawMountains(cFurther,cCloser)            % 画出山脉效果
% =========================================================================
% 功能函数:
% -------------------------------------------------------------------------
% 渐变背景生成函数function drawSky(colSky,colFurther)% 颜色由hsv转rgbcolSky=hsv2rgb(colSky./[360,100,100]);colFurther=hsv2rgb(colFurther./[360,100,100]);%构建渐变色网格[XMesh,YMesh]=meshgrid(1:800,301:600);ZMesh=zeros(size(XMesh));CMesh=vColorMat([800,300],[colFurther;colSky]);surf(XMesh,YMesh,ZMesh,'CData',CMesh,'EdgeColor','none');end
% -------------------------------------------------------------------------
% 云绘制函数function drawClouds(colClouds)colClouds=hsv2rgb(colClouds./[360,100,100]);% 随机噪声生成[X,Y]=meshgrid(linspace(0,1,500));CLX=(-cos(X.*2.*pi)+1).^.2;CLY=(-cos(Y.*2.*pi)+1).^.2;r=(X-.5).^2+(Y-.5).^2;alp=abs(ifftn(exp(3i*rand(500))./r.^.8)).*(CLX.*CLY);alp=alp./max(alp,[],'all');CMesh=zeros([size(alp),3]);CMesh(:,:,1)=colClouds(1);CMesh(:,:,2)=colClouds(2);CMesh(:,:,3)=colClouds(3);% 越向下、云越透明dy=(1:500)./500.*0.8+0.2;image([0,800],[350,600],CMesh,'AlphaData',alp.*(dy'));end
% -------------------------------------------------------------------------
% 山峰绘制函数function drawMountains(colFurther,colCloser)[X,Y]=meshgrid(linspace(0,1,800));CLX=(-cos(X.*2.*pi)+1).^.2;CLY=(-cos(Y.*2.*pi)+1).^.2;r=(X-.5).^2+(Y-.5).^2;% 8层山for i=1:8% 每次都生成一次二维随机噪声,并取其中一行的数据h=abs(ifftn(exp(5i*rand(800))./r.^1.05)).*(CLX.*CLY).*10;nh=(8-i)*30+h(400,:);if i==1,nh=nh.*.8;endhm=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,850],[0,hm],CMesh,'AlphaData',alp.*0.98);        endend
% =========================================================================
% 一个线性插值的渐变图生成函数function colorMat=vColorMat(matSize,colorList)yList=((0:(matSize(2)-1))./(matSize(2)-1))';xList=ones(1,matSize(1));% 线性插值colorMat(:,:,1)=(colorList(1,1)+yList.*(colorList(2,1)-colorList(1,1)))*xList;colorMat(:,:,2)=(colorList(1,2)+yList.*(colorList(2,2)-colorList(1,2)))*xList;colorMat(:,:,3)=(colorList(1,3)+yList.*(colorList(2,3)-colorList(1,3)))*xList;end
end

本人将代码再次略作改编,贴合中秋主题,又写了山间秋月的代码,能够动态展示变换的云雾以及慢慢变圆的月亮:

function autumoon_2
% @author : slandarer
% gzh  : slandarer随笔% axes设置
ax=gca;
ax.XTick=[];
ax.YTick=[];
ax.XLim=[0,800];
ax.YLim=[0,600];
ax.DataAspectRatio=[1 1 1];
hold(ax,'on');
% =========================================================================
% 颜色预定义,注意此处是hsv格式
cFurther=[225,35,70];  % 远山的颜色
cCloser=[210,70,10];   % 近山的颜色
cClouds=[250 26 43];   % 云的颜色
cSky=[215 100 18];     % 天空的颜色% 月亮颜色格式为rgb
cMoon=[253,252,222]./255;
% =========================================================================
% 绘图函数调用
ax.Color=hsv2rgb(cFurther./[360,100,100]); % 背景为远山的颜色
drawSky(cSky,cFurther)                     % 画出天空颜色渐变效果 % 基础绘制月亮
t1=linspace(-pi/2,pi/2,100);
t2=linspace(pi/2,3*pi/2,100);
X1=cos(t1).*35;Y1=sin(t1).*35;
X2=cos(t2).*35;Y2=sin(t2).*35;
moonHdl=fill([X1,X2]+600,[Y1,Y2]+500,cMoon,'EdgeColor','none');% 画出彩色云朵效果
cloudsCMesh=getCloudsCMesh(cClouds);
cloudsAlpha1=getCloudsAlp();
cloudsAlpha2=getCloudsAlp();
cloudHdl=image([0,800],[250,600],cloudsCMesh,'AlphaData',cloudsAlpha1);drawMountains(cFurther,cCloser)            % 画出山脉效果
% 随着时间变化月亮逐渐变圆
k=linspace(-1,1,100);
for n=1:length(k)tX2=X2.*k(n);moonHdl.XData=[X1,tX2]+600;cloudHdl.AlphaData=cloudsAlpha1+(cloudsAlpha2-cloudsAlpha1).*n./length(k);pause(.1)
end
% =========================================================================
% 功能函数:
% -------------------------------------------------------------------------
% 渐变背景生成函数function drawSky(colSky,colFurther)% 颜色由hsv转rgbcolSky=hsv2rgb(colSky./[360,100,100]);colFurther=hsv2rgb(colFurther./[360,100,100]);%构建渐变色网格[XMesh,YMesh]=meshgrid(1:800,301:600);ZMesh=zeros(size(XMesh));CMesh=vColorMat([800,300],[colFurther;colSky]);surf(XMesh,YMesh,ZMesh,'CData',CMesh,'EdgeColor','none');end
% -------------------------------------------------------------------------
% 云绘制函数function CMesh=getCloudsCMesh(colClouds)colClouds=hsv2rgb(colClouds./[360,100,100]);CMesh=zeros([500,500,3]);CMesh(:,:,1)=colClouds(1);CMesh(:,:,2)=colClouds(2);CMesh(:,:,3)=colClouds(3);endfunction Alpha=getCloudsAlp(~,~)% 随机噪声生成[X,Y]=meshgrid(linspace(0,1,500));CLX=(-cos(X.*2.*pi)+1).^.2;CLY=(-cos(Y.*2.*pi)+1).^.2;r=(X-.5).^2+(Y-.5).^2;alp=abs(ifftn(exp(3i*rand(500))./r.^.8)).*(CLX.*CLY);alp=alp./max(alp,[],'all');dy=(1:500)./500.*0.8+0.2;Alpha=alp.*(dy');end
% -------------------------------------------------------------------------
% 山峰绘制函数function drawMountains(colFurther,colCloser)[X,Y]=meshgrid(linspace(0,1,800));CLX=(-cos(X.*2.*pi)+1).^.2;CLY=(-cos(Y.*2.*pi)+1).^.2;r=(X-.5).^2+(Y-.5).^2;% 8层山for i=1:8% 每次都生成一次二维随机噪声,并取其中一行的数据h=abs(ifftn(exp(5i*rand(800))./r.^1.05)).*(CLX.*CLY).*10;nh=(8-i)*30+h(400,:);if i==1,nh=nh.*.8;endhm=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,850],[0,hm],CMesh,'AlphaData',alp.*0.98);        endend
% =========================================================================
% 一个线性插值的渐变图生成函数function colorMat=vColorMat(matSize,colorList)yList=((0:(matSize(2)-1))./(matSize(2)-1))';xList=ones(1,matSize(1));% 线性插值colorMat(:,:,1)=(colorList(1,1)+yList.*(colorList(2,1)-colorList(1,1)))*xList;colorMat(:,:,2)=(colorList(1,2)+yList.*(colorList(2,2)-colorList(1,2)))*xList;colorMat(:,:,3)=(colorList(1,3)+yList.*(colorList(2,3)-colorList(1,3)))*xList;end
end

静态图:

《皓月当空》

需要下载mapping toolbox或者直接使用文末压缩包内的moonalb20c.mat文件,该文件是真实月球表面数据:

% @author : slandarer
% gzh  : slandarer随笔% 数据读取
load moonalb20c.mat[X,Y,Z0]=sphere(30);
surf(X,Y,Z0,'FaceColor','texturemap','CData',moonalb20c,'EdgeColor','none','FaceAlpha',.5)% 调色
colormap gray
fig=gcf;
fig.Color=[0,0,0];% 旋转
for i=0:(2*pi/200):(4*pi)campos([cos(i),sin(i),.5])axis off vis3dpause(.1)drawnow
end


全部文件获取:

链接:https://pan.baidu.com/s/1WQRcL-Blj_GshG69TnYvyw?pwd=slan
提取码:slan

MATLAB | 中秋节 · 绘制《山间秋月》及《皓月当空》相关推荐

  1. matlab中如何求零极点,Matlab中绘制零极点

    <Matlab中绘制零极点>由会员分享,可在线阅读,更多相关<Matlab中绘制零极点(2页珍藏版)>请在人人文库网上搜索. 1.ZPLANE Z-plane zero-pol ...

  2. matlab图形绘制经典案例,MATLAB经典教程第四章_图形绘制.ppt

    <MATLAB经典教程第四章_图形绘制.ppt>由会员分享,可在线阅读,更多相关<MATLAB经典教程第四章_图形绘制.ppt(32页珍藏版)>请在人人文库网上搜索. 1.Ma ...

  3. 【新星计划】MATLAB plot绘制图像

    在MATLAB中绘制函数图形的步骤如下: 先定义变量 x,通过指定的变量 x 值的范围,该函数被绘制: 然后定义函数, y = f(x): 最后调用 plot 命令,如 plot(x, y). 接下来 ...

  4. Matlab:绘制简单能量的接收机工作特性曲线(Energy_detection_simulation_ok)

    Matlab:绘制简单能量的接收机工作特性曲线(Energy_detection_simulation_ok) 目录 输出结果 实现代码 输出结果 实现代码 % This code is to plo ...

  5. matlab线旋转成面,用matlab怎么绘制一条曲线绕z轴旋转生成的曲面?

    用matlab怎么绘制一条曲线绕z轴旋转生成的曲面? 已知数据如下: x z y -398.10815554637100 391.8559758318630 690.066133543041 -381 ...

  6. matlab中饼图绘制程序,MATLAB中绘制二维饼图的函数是(? ? ) (1.5分)

    MATLAB中绘制二维饼图的函数是(? ? ) (1.5分) 答:pie 计算机的内存储器比外存储器读写速度 ______ 答:快 新民主主义革命时期,提出了反帝反封建这个任务就等于真正懂得了什么叫反 ...

  7. [Matlab]Simulink绘制3维图像

    [Matlab]Simulink绘制3维图像 绘制1维和2维图像时,在Simulink中一般使用Scope,而为了获得更多的显示功能,我们也可以通过定义S-Function来实现/封装任何所希望的功能 ...

  8. tyvector在matlab中代表,MATLAB曲线绘制

    信号源产生的方法 来源:http://www.2cto.com/kf/201401/270494.html  matlab的checkerboard说明,GOOD! 来源:http://www.chi ...

  9. 【MATLAB】绘制矢量场图

    Step 1 在MATLAB中绘制矢量场图的函数是quiver,利用help命令查看该函数的解释. 一般来说,输入参数可以是四个(x,y,u,v),也可以是两个参数(u,v),要求是这些参数都大小相同 ...

最新文章

  1. iOS - UIStoryboard
  2. R语言_基本数据管理
  3. ubuntu 13.10 amd64安装ia32-libs
  4. java 生成objectid_【Java】唯一ID的几种生成方案
  5. ActiveMq C#客户端 消息队列的使用(存和取)
  6. 二叉树序列化与反序列化相关题目(Leetcode题解-Python语言)
  7. 在matlab中function,Matlab中function函数使用操作方法
  8. codevs 1422 河城荷取
  9. JS/Vue动态获取浏览器高度
  10. error LNK2005: 已经在*.obj中定义
  11. 连接到此计算机的本地打印机无法选择,Win7系统连接打印机出现本地打印后台处理程序服务没有运行怎么办...
  12. mysql通过股票代码查数据_如何在交易数据中查询各个版本交易量前三的股票?(MySQL分组排名)...
  13. 复习单片机:温度检测 DS18B20(内含:1 DS18B20 介绍+2 硬件设计+3 软件设计+4 实验现象)
  14. DCC:Deep continuous clustering
  15. 2月22日 星期三 杨祎祾
  16. 谷歌外链发多少条能有效提升排名?
  17. 离散数学大作业——C++实现集合的基本运算
  18. RHEL5.5配置sftp (已验证)
  19. 人渣!鄂尔多斯一男子发布前女友裸照,被警方拘留!
  20. 各大互联网公司技术博客汇总

热门文章

  1. 京东获取推荐商品列表 API
  2. 阿里妈妈技术:广告间排序和广告内创意优选联合优化(CACS)
  3. 分数傅立叶变换的性质
  4. python中有指针吗_Python中的指针——到底指什么(一)
  5. RxJava简单使用
  6. 2020人口普查全国人口学历分布情况
  7. 哥大五年CV岁月:只有开心,才能做出有影响力的工作
  8. Flash Loader Demonstrator无响应怎么办?
  9. poi导入excel日期处理_POI处理Excel中各种日期格式问题
  10. 京浜光电IPO被终止:曾拟募资7.1亿 实控人已改为日本籍