利用Matlab实现绘制中秋山间秋月和皓月当空效果

目录
  • 绘制效果
  • 山间秋月
  • 皓月当空

中秋节还有三天就到了,中秋节啊,阖家团圆的日子,又有多少人去摆弄电脑甚至打开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转rgb
        colSky=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;end
            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,850],[0,hm],CMesh,'AlphaData',alp.*0.98);
        end
    end
% =========================================================================
% 一个线性插值的渐变图生成函数
    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转rgb
        colSky=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);
    end
    function 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;end
            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,850],[0,hm],CMesh,'AlphaData',alp.*0.98);
        end
    end
% =========================================================================
% 一个线性插值的渐变图生成函数
    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 vis3d
    pause(.1)
    drawnow
end

全部文件获取:

链接:https://pan.baidu.com/s/162CUlO9-33SiNx-7ZemVmA

提取码:h71f

到此这篇关于利用Matlab实现绘制中秋山间秋月和皓月当空效果的文章就介绍到这了,更多相关Matlab中秋内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用Matlab绘制七夕咕呱小青蛙

    目录 基础代码 动图生成代码 咕呱,咕呱,咕呱 咕呱,咕呱,咕呱 咕呱,咕呱,咕呱 七夕节到了还不快给你的朋友安排上这只咕呱小青蛙? 基础代码 function gugua ax=gca; ax.DataAspectRatio=[1 1 1]; ax.XLim=[-5 5]; ax.YLim=[-5 5]; ax.XColor='none'; ax.YColor='none'; ax.Color=[115,173,194]./255; hold on % hold(ax,'on') % ====

  • 利用Matlab绘制一个可爱的南瓜灯

    目录 效果及原理 原理 实现方法 完整代码 效果及原理 效果如下: 调一下数据还能改成三角眼: 原理 南瓜主体函数从知友 [九章算法] 的一张图而来,大体是瓜身瓜柄分段函数,然后绕着z轴旋转一周得到曲面,我对数值做了微调,原图及原始数据: 实现方法 这里我故意保留了网格让南瓜看起来有一点布娃娃的感觉,(大家也可以根据自己喜好改写,例如将’EdgeColor’设置为’none’并打个光啥的) % 构造网格 [t,p]=meshgrid(linspace(0,2*pi,200),linspace(0

  • 基于Matlab绘制超绚丽的烟花的过程详解

    目录 1.使用效果 2.随机点生成 3.图像膨胀 4.特效「风」模拟 5.级坐标变换 6.图像模糊及再映射 7.图像上色 8.完整代码 1.使用效果 2.随机点生成 我们要构造一个黑色背景,对其添加高斯噪声,然后依据阈值删掉部分噪声,生成一张随机点图片: % 构造黑色背景并生成白色杂点 blackPic=uint8(zeros(800,800)); distPic=imnoise(blackPic,'gaussian',0, 0.11); distPic(distPic<254)=0; 3.图像

  • 详解Matlab如何绘制小提琴图

    目录 1使用示例 基础使用,Y为矩阵 基础使用,Y为向量,X为标签 基础使用多个图像绘制,并添加图例 2完整代码 写了个matlab绘制小提琴图的函数: 1.图中小提琴状区域为核密度曲线 2.白色方块为25%,75%分位数 3.中间横线为中位数 4.白色点为离群值点 5.竖着的黑线是去掉离群值点后点的上下限 1使用示例 基础使用,Y为矩阵 X=1:5; Y=randn(100,5); Hdl1=violinChart(gca,X,Y,[0 0.447 0.741],0.6); X:横坐标 Y:数

  • Python&Matlab实现樱花的绘制

    目录 1.锦短情长 2. 一场樱花雨(Matlab) 3.樱花树(Python) 1.锦短情长 为什么选择这个标题,借鉴了一封情书里面的情长纸短,还吻你万千. 锦短情长 都只谓人走茶凉,怎感觉锦短情长? 一提起眼泪汪汪,是明月人心所向? 2. 一场樱花雨(Matlab) function pingba hold on,axis equal axis(0.5+[-10,50,0,50]) set(gca,'xtick',[],'ytick',[],'xcolor','w','ycolor','w'

  • 利用Matlab绘制有趣图像的示例代码

    目录 1.随机樱花树 2.苹果绘制 3.南瓜绘制 4.一堆三角形绘制 5.月饼绘制 6.大钻石绘制 7.有趣曲线1 8.有趣曲线2 9.有趣曲线3——蝴蝶曲线 10.有趣曲线4——心形曲线 11.有趣曲线5 12.会害羞的含羞草 13.随机雪景 1.随机樱花树 function sakura % @author:slandarer % 随机形状二叉树樱花树绘制 hold on,axis equal axis(0.5+[-10,50,0,50]) set(gca,'xtick',[],'ytick

  • 利用Matlab实现绘制中秋山间秋月和皓月当空效果

    目录 绘制效果 山间秋月 皓月当空 中秋节还有三天就到了,中秋节啊,阖家团圆的日子,又有多少人去摆弄电脑甚至打开MATLAB?因此要发就现在! 绘制效果 月饼绘制,立体月饼绘制,月饼状统计图往年我都已经画过了,那么今年不妨从月亮下手,两个动态绘图奉上. 山间秋月 在好久之前看到童晶老师<Python趣味创意编程>一书中有一山水绘制示例非常惊艳,但用了一些python中有matlab中没有的函数,一时手痒就改了个MATLAB版: function landScape % python代码原作出处

  • 利用Matlab复刻两款粒子爱心动画效果

    目录 粒子爱心1 效果图 粒子爱心2 效果图 粒子爱心1 function particleHeart1 % @author : slandarer % 调整背景及比例 ax=gca;hold on ax.DataAspectRatio=[1,1,1]; ax.XLim=[-25,25]; ax.YLim=[-25,20]; ax.Color=[0,0,0]; ax.XColor='none'; ax.YColor='none'; set(gcf,'Color',[0,0,0]); % 散点位置

  • 利用Matlab绘制各类特殊图形的实例代码

    Matlab绘图介绍 强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数.此外,Matlab还提供了直接对图形句柄进行操作的低层绘图操作.这类操作将图形的每个图形元素(如坐标轴.曲线.文字等)看做一个独立的对象,系统给每个对象分配一个句柄,可以通过句柄对该图形元素进行操作,而不影响其他部分. Matlab绘制特殊图形 1. 绘制极坐标图 说明:使用polarplot函数绘制极

  • 中秋快到了利用 python 绘制中秋礼物

    目录 导语 正文 总结 导语 ​ 哈喽哈喽!大家上午好,我是木木子. 新的一天开始啦,之前写了很多的画图代码嗯哼!你们还记得嘛?我就不整理了蛮多滴,你们可以自己翻翻往期的文章哈,有简单的 也有难点儿的总有一款适合你们~嘿嘿. 话说--中秋也快到了,你们放几天假吖? 假期长的小伙伴儿知道回家带什么礼物更让家人开心嘛?假装不知道.jpg. 小编告诉你们:当然是带着你们的男朋友.女朋友回家了~,来来来,有了对象没得对象的都看过来哈,时间仓促,给你们的中秋福利送了哈,写一个简单的中秋表白的画图源码啦!

  • 利用Matlab绘制地图的超详细教程

    目录 MappingToolbox工具箱安装 局部区域陆地绘制 映射贴图 纹理贴图 线路图绘制 usamap axesm 一些地图绘制可用简易函数 subplot tightmap 边框标签网格快速开关函数 colormap colorbar worldmap和usamap是axesm的子类,worldmap是用于生成世界地图坐标区域,usamap用于生成美国地图坐标区域,本文先在worldmap函数基础上讲解如何导入各种数据绘制各种类型图片,略提一下如何使用usamap,再讲解axesm的各种

  • 利用Matlab绘制一款专属进度条

    目录 1.使用效果 2.制作历程 3.函数用法 4.工具函数完整代码 waitBar_SL1.m waitBar_SL2.m waitBar_SL3.m waitBar_SL4.m 5.下载地址 1.使用效果 2.制作历程 首先我有个程序需要用到进度条,我首先试了一下MATLAB自带的进度条: bar=waitbar(0,'读取数据中...'); % waitbar显示进度条 for i=1:1000 A(i)=rand(); str=['计算中...',num2str(100*i/1000),

  • 如何利用Matlab绘制出好看的火山图

    这里画了一个示例: 数据来源 绘制效果: 代码及说明: 使用代码时只需要改一开始导入的数据,和代码提示中X坐标区域范围和Y坐标区域范围,完整代码如下所示: % 读取数据 data=readmatrix('volcano.txt'); logFC=data(:,2); padj=data(:,3); DB_not=(padj>0.5)|(logFC<0.5&logFC>-0.5); DB_up=padj<=0.05&logFC>=0.5; DB_down=pad

  • 利用Matlab绘制好看的旋转九边形

    目录 PART.0 使用效果 PART.1 程序说明 PART.2 完整代码 PART.0 使用效果 PART.1 程序说明 这个代码主要复刻的Clayton Shonkwiler使用Wolfram绘制的作品(二十个旋转的正九变形),据说其灵感来源于Thomas Davis的一些作品,Clayton Shonkwiler的更多作品可以在这个地址查看 PART.2 完整代码 function nonagon20 % @author:slandarer % axes属性设置 ax=gca; hold

随机推荐