MATLAB之画确定区域内互不接触的球

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

运行结果:

坐标:

总的球图:

部分区域放大后:

原文地址:https://www.cnblogs.com/HZL2017/p/7265452.html