MATLAB之画确定区域内互不接触的球
程序要求:在确定区域内,画互不接触的球
输入:球的个数N,半径D,两球之间的最小距离K倍(D的倍数)
输出:各圆心的三维坐标,并作图显示
程序:
function [xdata,ydata,zdata] = dataBall2(N,D,K)
%N为球的个数,D为球的半径,K为两球之间的距离(D的倍数)
%返回球心的坐标
%命令行测试: [xdata,ydata,zdata] = dataBall2(50,1.5,4);
S=[300,300,200]; %区域大小
p = ones(1,3);
p(1)=(S(1)- D).*rand(1); %产生一个随机点
p(2)=(S(2)- D).*rand(1);
p(3)=(S(3)- D).*rand(1);
A=p\'; %第一点坐标记录进矩阵A中,转置运算
for ii=2:N
p(1)=(S(1)- D).*rand(1); %产生一个随机点
p(2)=(S(2)- D).*rand(1);
p(3)=(S(3)- D).*rand(1);
while any((A(1,:)-p(1)).^2+(A(2,:)-p(2)).^2+(A(3,:)-p(3)).^2 < K*K*D*D) %距离判断,不满足条件则继续生成新的点
p(1)=(S(1)- D).*rand(1); %产生新的随机点
p(2)=(S(2)- D).*rand(1);
p(3)=(S(3)- D).*rand(1);
end
A = [A,p\']; %保存满足条件的新点到矩阵A
end
xdata = A(1,:);
ydata = A(2,:);
zdata = A(3,:);
%已知圆心和半径作圆:半径D,圆心xdata,ydata,zdata
for i = 1:N
[x,y,z] = ellipsoid(xdata(i),ydata(i),zdata(i),D,D,D); %利用椭圆函数画球
surf(x,y,z) %画出来球
hold on
end
axis equal %保证各个维度的长短一致
end
运行结果:
坐标:
总的球图:
部分区域放大后: