function [Sph]=ConcreteBone_3D3
%500个随机球形骨料在受限空间(球体)随机分布模型,球体内随机分布三维球形随机骨料,可以随意控制骨料体积比
clear all
close all
clc
%球体
Pi=3.1415926;
Range=zeros(3,1);%3行1列
Range(1,1)=0;%球体X轴坐标,1行1列
Range(2,1)=0;%球体Y轴坐标,2行1列
Range(3,1)=0;%球体Z轴坐标,3行1列
centerx=[0];%球体X轴坐标
centery=[0];%球体Y轴坐标
centerz=[0];%球体Z轴坐标
R=150;%球体半径
[x,y,z]=sphere(20)%球体包含20*20个面
surf(R*x+centerx,R*y+centery,R*z+centerz,'FaceColor','g','LineStyle','none','FaceAlpha','0.1');
hold on
R1max=5;
R1min=4;
R2max=4;
R2min=2.5;
R3max=2.5;
R3min=1.5;
P=0.1;%孔隙率
p1=0.3;%R1粒径孔隙率
p2=0.5;%孔隙率
p3=0.3;%R3孔隙率
m=0;
V=0;
for i=1:500%500随机骨料示例
x=(2*rand(1)-1)*(R-Range(1,1))+Range(1,1);%2*rand(1)-1生成[-1,1]内的随机数
y=(2*rand(1)-1)*(R-Range(2,1))+Range(2,1);
z=(2*rand(1)-1)*(R-Range(3,1))+Range(3,1);
if (V<=(Pi*4./3)*150^3*P*p1)
r=rand(1)*(R1max-R1min)+R1min;%(Pi*4./3)*150^3*P*p1)球体体积
elseif (V>(Pi*4./3)*150^3*P*p1 && V<=(Pi*4./3)*150^3*P*(p1+p2))
r=rand(1)*(R2max-R2min)+R2min;
else (V>(Pi*4./3)*150^3*P*(p1+p2) && V<=(Pi*4./3)*150^3*P*(p1+p2+p3));
r=rand(1)*(R3max-R3min)+R3min;
end
v=4/3*pi*r.^3;
if -150<=-sqrt((x)^2+(y)^2+(z)^2) && sqrt((x)^2+(y)^2+(z)^2)<=150;
if ((abs(x)-r)>Range(1,1) && x+r<R) && (abs(y)-r>Range(2,1))&&(y+r<R)&&(abs(z)-r>Range(3,1)&& z+r<R)
if m==0
m=m+1;
Sph(m,:)=[x y z r v V];
else
n=0;
for j=1:m
D=sqrt((Sph(j,1)- x)^ 2+(Sph(j,2)- y)^ 2+(Sph(j,3)- z)^ 2);
if D<r+Sph(j,4)
break;
else
n=n+1;
end
if n==m
m=m+1;
V=V+Sph(j,5);
Sph(m,:)=[x y z r v V];
end
end
end
end
end
if V>150^3*P
break;
end
end
[xx,yy,zz]=sphere(20);
filename ='500个随机球形骨料在受限空间(球体)随机分布模型动画.gif';
f = getframe(gcf);
IM = frame2im(f);
[IM,map] = rgb2ind(IM,256);
imwrite(IM,map,filename,'gif','WriteMode','append','DelayTime',0.0002);
for i=1:m
surf(xx*Sph(i,4)+Sph(i,1),yy*Sph(i,4)+Sph(i,2),zz*Sph(i,4)+Sph(i,3));
box on%box on 显示围绕当前坐标区的框轮廓。此选项将当前坐标区的 Box 属性设置为 'on'。
ax = gca;%返回当前图窗的当前坐标区或图,这通常是最后创建的图窗或用鼠标点击的最后一个图窗。图形函数(例如 title)的目标为当前坐标区或图。可以使用 ax 访问和修改该坐标区或图的属性。如果该坐标区或图不存在,gca 将创建笛卡尔坐标区。
ax.BoxStyle = 'full';%通过将 BoxStyle 属性设置为 'full',显示围绕整个坐标区的轮廓。
ax.XColor = 'red';%通过设置坐标区的 XColor 属性,更改 x 轴方向的框轮廓的颜色。
ax.YColor = 'm';
ax.ZColor = 'b';
ax.LineWidth = 0.5;%轴轮廓、刻度线和网格线的宽度
colorbar;
axis image, view(3)
title('500个随机球形骨料在受限空间(球体)随机分布模型');%
hold on;
f = getframe(gcf);
IM = frame2im(f);
[IM,map] = rgb2ind(IM,256);
imwrite(IM,map,filename,'gif','WriteMode','append','DelayTime',0.0002); % 使用 append mode 时*.gif必须是已经存在的;
%解决方法一:如上所说先使用 overwrite mode ,之后再改回 append mode,这种方法可以,但是由于是附加操作,这样制作出了的gif的第一帧和最后一帧是一样的。
%解决方法二: 在使用 append mode,前加一条语句来创建*.gif文件,但要保证只在第一帧时创建.
end