月满中秋
阖家团圆
中秋快乐 阖家团圆
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 on
axis([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 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
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.mat
b = (.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 on
for n = 1:m
surf(b,b', d*n, d + cat(3,1,1,1), 'EdgeA',0, 'FaceA',max(.2,l(n))./m.^1.2);
end
zlim([-a/2, 1.2*a])
shading flat
CList = [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 off
camva(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