MATLAB | 中秋πlog,大家一起用MATLAB赏月叭

文摘   2024-09-16 18:33   英国  

月满中秋

阖家团圆

中秋快乐 阖家团圆

Mid-autumn Festival


祝大家

中秋快洛

中秋πlog

中秋节相关的实在不知道干啥了,月饼月饼画过了,月亮月亮画过了,赏月的风景画过了,一堆圆形的科研绘图也画过了,这期来个排列组合,真实曲面的月亮+风景:

在此之前先看看这幅图是由哪两段代码组合成的叭。




风景图绘制




我最近又对这段代码进行了改进,现在这段代码短了很多,但还是要求使用至少R2017b之后的版本运行。

% python出处:童晶|《Python趣味创意编程》% MATLAB代码改写 :slandarer% 计算基础数据a = 800; b = 600;d = (.5:a)'/a;s = (-cos(d*2*pi) + 1).^.2;f = d-.5; r = f'.^2 + f.^2;% 坐标区域修饰hold onaxis([0,a,0,b]);set(gca, 'XTick',[], 'YTick',[], 'DataAspectRatio',[1,1,1], 'Color',[.67,.7,.9])% 绘制渐变背景[X,Y] = meshgrid(1:a, 301:b);V = repmat(linspace(1, 0, 300)', [1,a]);t = [0,1]; I = @interp1;V = cat(3, I(t, [.25,.68], V), I(t, [1/3,.7], V),I(t, [.5,.9], V));surf(X,Y,X.*0, 'CData',V, 'EdgeColor','none');% 绘制云彩P = abs(ifftn(exp(3i*rand(a))./r.^.8)).*(s*s');C = zeros([a,a,3]);C(:,:,1) = 1; C(:,:,2) = .75; C(:,:,3) = .88;y = (1:a)./a.*.8 + .2;image([0,a], [400,b], C, 'AlphaData',P.*(y'));% 绘制8座山c1 = [230,25,90]; c2 = [210,70,10];for i = 1:8    H = abs(ifftn(exp(5i*rand(a))./r.^1.05)).*(s*s').*10;    nh = (8-i)*30 + H(400,:);    hm = ceil(max(nh));    C = zeros([hm,a,3]);    tc = c1 + (c2 - c1)./8.*i;    tc = hsv2rgb(tc./[360,100,100]);    C(:,:,1) = tc(1); C(:,:,2) = tc(2); C(:,:,3) = tc(3);    P = ones(hm,a);    P((1:hm)' > nh) = nan;    image([-50,850], [0,hm], C, 'AlphaData',P.*.98);end




月亮绘制


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

https://pan.baidu.com/s/1Y8s89dtZyP4EGCums1mZhg?pwd=slan 

% 数据读取load moonalb20c.mat
[X,Y,Z0]=sphere(30);surf(X,Y,Z0,'FaceColor','texturemap','CData',moonalb20c,'EdgeColor','none','FaceAlpha',.5)
% 调色colormap grayfig=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)    drawnowend


3D赏月风景


该代码也需要使用前面提到的月球表面数据:

https://pan.baidu.com/s/1Y8s89dtZyP4EGCums1mZhg?pwd=slan 

clc; clear; close all;rng(16)a = 200;figure('Units','normalized', 'Position',[.3,.1,.6,.75], 'Color', hsv2rgb([215 100 18]./[360,100,100]));ax = gca;ax.NextPlot = 'add';ax.DataAspectRatio = [1,1,a];ax.Position = [-1/6, -1/4, 1 + 1/3, 1 + 1/2];load moonalb20c.matb = (.5:a)'/a;c = (-cos(b*2*pi) + 1).^.2;d = ones(a);f = b - .5;r = f'.^2 + f.^2;% 画山m = 50;H = abs(ifftn(exp(7i*rand(a))./r.^.9)).*(c*c')*30;l = (m:-1:1)/m;% 添加云雾hold onfor n = 1:m    surf(b,b', d*n, d + cat(3,1,1,1), 'EdgeA',0, 'FaceA',max(.2,l(n))./m.^1.2);endzlim([-a/2, 1.2*a])shading flatCList = [144,157,205; 7,17,27]./255;LM = [min(min(H)),max(max(H))];CM1(:,:,1) = interp1(LM, CList(:,1), H, 'pchip');CM1(:,:,2) = interp1(LM, CList(:,2), H, 'pchip');CM1(:,:,3) = interp1(LM, CList(:,3), H, 'pchip');surf(b,b', H, 'CData', CM1, 'EdgeColor','none')[X,Y,Z0]=sphere(30);surf(X./20 + .8, Y./20 + .6, Z0.*a./20 + .7.*a,'FaceColor','texturemap',...    'CData',moonalb20c,'EdgeColor','none','FaceAlpha',.5)CM2 = gray;CM2 = CM2(120:end,:).*[253,252,222]./255.*1.2;CM2(CM2 > 1) = 1;colormap(CM2)axis offcamva(5); view(35, 35)for i = 1:5000    view(35 + i./5, 35); pause(.01)end


弦图绘制


文章的最后还是推荐一下我的弦图绘制工具,可以绘制各种圆圆的图形,非常应景,强烈建议大家中秋当晚打开MATLAB开始学习:


MATLAB | 这些美丽大方的弦图居然都是用MATLAB画的?

MATLAB | MATLAB弦图绘制工具又有了两种标刻度的格式?

MATLAB | 绘图复刻(十六) | 弦图2.1.0版本更新——弦末端弧形块颜色单独设置

MATLAB | 全网唯一的弦图绘制函数大更新、刻度标签添加、内置标签旋转函数

MATLAB | 全网唯一!MATLAB双向弦图(有向弦图)绘制

MATLAB | 全网唯一!使用MATLAB绘制好看的弦图!


https://gitee.com/slandarer/matlab-chord-chart


!中秋快洛!

请尊重原创劳动成果

转载请注明本文链接

及文章作者:slandarer





slandarer随笔
slandarer个人公众号,目前主要更新MATLAB相关内容。
 最新文章