
过冷水诚挚邀请你加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载,qq:927550334
![]()
过冷水在往期文章中曾经给出了三维空间的粒子运动图。

可以很明显的看出来,用Matlab绘制出来的图也太不美观了,一直思索如何让Matlab绘制的三维图稍微好看一点,最终还是找到了图像美化命令,本期过冷水就和大家分享如何让你的图像好看起来。

先来看一下之前绘图命令
clear
tic
height=11.1087999344000004;width=11.1087999344000004;long=11.1087999344000004;
N=52;
load('data.mat')
for i=1:length(a)/N
b= a(1 (N*(i-1)):N*i,:);
Centers{i,1}=b;
end
gg = 1;
figure1 =figure('Position',[395 86 894 700],'Name','Mg原子三维空间运动轨迹','NumberTitle','off','Color','w','Menubar','figure','WindowState','maximized');
axes1 = axes('Parent',figure1);
view(axes1,[-37.5 30]);
for k=1:length(Centers)
centers=Centers{k,1};
fill3([0 14 14 0],[0 0 14 14],[0 0 0 0],[0 1 1],'Parent',axes1);
hold(axes1,'on');
fill3([0 14 14 0],[14 14 14 14],[0 0 14 14],[0 0 1],'Parent',axes1);
fill3([14 14 14 14],[0 0 14 14],[0 14 14 0],[1 0 0],'Parent',axes1);
plot3(centers(:,1),centers(:,2),centers(:,3),'Parent',axes1,'MarkerFaceColor',[0 1 1],'MarkerEdgeColor',[0 0.447058826684952 0.74117648601532],'MarkerSize',8,'Marker','o','LineStyle','none');
hold(axes1,'off');
str1=['01';'02';'03';'04';'05';'06';'07';'08';'09';'10';'11';'12';'13';'14';'15';'16';'17';'18';'19';'20';'21';'22';'23';'24';'25';'26';'27';'28';'29';'30';'31';'32';'33';'34';'35';'36';'37';'38';'39';'40';'41';'42';'43';'44';'45';'46';'47';'48';'49';'50';'51';'52'];
text(axes1,centers(:,1),centers(:,2),centers(:,3),str1,'FontSize',14,'fontname','楷体','Color','red');
fmat(:,k)=getframe; %拷贝祯到矩阵fmat中
im = frame2im(getframe);
[I,map] = rgb2ind(im,256);
if gg == 1
imwrite(I,map,'lxx.gif','GIF', 'Loopcount',inf,'DelayTime',0.05);
gg = gg 1;
else
imwrite(I,map,'lxx.gif','WriteMode','append','DelayTime',0.05);
end
end该绘图命令没有太特殊的地方,就是简单的提取数据,使用plot3在空间中绘制一系列点,这是最简单的方式,过冷水在Matlab光源材质设置技巧一文中给出了这样的一张图

这就是光源设置技巧,同时也给予了图像修改思路。
1绘制粒子点可以改为绘制球体,因为球体可以设置属性,进行美观设置;
2 之前粒子用来表示三维空间的办法是以平面填充做背景,其实过冷水本身想要的效果时小球在盒子里做运动的图像,当时不知道怎么操作,其实就是绘制一个盒子然后进行透明度设置就可以了,并不是十分复杂。
3 对球体大小和盒子的大小进行合理设置就可以得到一张美观的空间中小球在盒子中运动的图像了。
clear
tic
height=11.1087999344000004;width=11.1087999344000004;long=11.1087999344000004;
N=52;
vert = [0 0 0;0 200 0;200 200 0;200 0 0;0 0 200;...
0 200 200;200 200 200;200 0 200];
fac = [1 2 3 4;2 6 7 3;4 3 7 8;1 5 8 4;1 2 6 5;5 6 7 8];
[x0,y0,z0] = sphere;
load('data.mat')
for i=1:length(a)/N
b= a(1 (N*(i-1)):N*i,:);
Centers{i,1}=b;
end
gg = 1;
figure1 = figure;
axes1 = axes('Parent',figure1);
set(axes1,'Color','none');
axis off
for k=1:length(Centers)
centers=Centers{k,1};
fill3([0 0 0 0],[0 0 0 0],[0 0 0 0],[0 0 0],'Parent',axes1);
axis off
xlim(axes1,[0 11]);ylim(axes1,[0 11]);zlim(axes1,[0 11]);
patch('Parent',axes1,'FaceLighting','phong','FaceAlpha',0.25,'Vertices',vert*0.05,'Faces',fac,'FaceColor',[0 1 0]);
hold(axes1,'on');
for i=1:52
x=centers(i,1) 0.25*x0;y = centers(i,2) 0.25*y0; z =centers(i,3) 0.25*z0;
surf(x,y,z,'Parent',axes1,'linestyle','none','FaceColor','r','EdgeColor','none')
end
light('Parent',axes1,'Position',[0.87002629614908 -0.876158217991139 0.703884722521496]);
view(axes1,[-37.5 30]);
hold(axes1,'off');
set(axes1,'DataAspectRatio',[1 1 1]);
fmat(:,k)=getframe; %拷贝祯到矩阵fmat中
im = frame2im(getframe);
[I,map] = rgb2ind(im,256);
if gg == 1
imwrite(I,map,'M.gif','GIF', 'Loopcount',inf,'DelayTime',0.05);
gg = gg 1;
else
imwrite(I,map,'M.gif','WriteMode','append','DelayTime',0.05);
end
end最终得到的图像如下图所示,有点美中不足的地方是图片的配景不能够设置成为透明,这样比如把其导入到图片ppt就会很难看,所以图片还行一点背景图片Ps技术,这超过过冷水专业范畴,有探索兴趣的读者可以自行摸索,本期过冷水主要目的就是分享一段绘制好看的三维空间粒子运动的程序。


过冷水发表于 仿真秀 平台原创文章,未经授权禁止私自转载,如需转载请需要和作者沟通表明授权声明,未授权文章皆视为侵权行为,必将追责。如果您希望加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载均可加群:927550334。
精品回顾
过冷水和你分享 matlab读取存储各种文件的方法 文末有独家金曲分享
