[已答复] 随机分布半径不相同的球,球与球最好相切

[复制链接]
Yakuza 发表于 2021-4-2 09:15:08
我想在100*100*100的盒子大小里随机生成半径为1、2、3的球,保证球不跑出盒子区域,尽量使球与球之间相切。最后我需要得到每一种半径球的球心坐标矩阵,,,,有大神帮忙吗?谢谢

8 条回复


gywxd 发表于 2021-4-2 19:48:03
本帖最后由 gywxd 于 2021-4-2 21:27 编辑

确保球与球之间相切  比较难实现,这个涉及到开方 出现 无理数的问题  而且要保证饱和填充运算压力也很大,并且大概率无法饱和填充。

gywxd 发表于 2021-4-2 23:18:25
本帖最后由 gywxd 于 2021-4-2 23:20 编辑

球是否随机放入, 如果新生成一个3 的球无法放了如何解决,你的要求都不明确

Yakuza 发表于 2021-4-7 15:04:18
gywxd 发表于 2021-4-2 23:18
球是否随机放入, 如果新生成一个3 的球无法放了如何解决,你的要求都不明确 ...

你好,谢谢您的帮忙。球怎么生成没有限制,球的个数也没有限制,想要的结果是一个正方体盒子中大小不同的球相切充满盒子,边缘处有空隙可以。最后输出每种半径的球对应的球心坐标

Yakuza 发表于 2021-4-7 15:07:36
gywxd 发表于 2021-4-2 19:48
确保球与球之间相切  比较难实现,这个涉及到开方 出现 无理数的问题  而且要保证饱和填充运算压力也很大, ...

如果不用保证每个球相切,但空隙不能太大,保证不重叠,这个程序您有思路吗?可以分享一下吗?

gywxd 发表于 2021-4-7 15:22:15
我做的是这个样子,但是和你说的不大一样, 随机生成一个球,如果填不进去就丢掉另外随机生成一个继续填充
屏幕截图 2021-04-04 175128.png

Yakuza 发表于 2021-4-7 20:08:12
gywxd 发表于 2021-4-7 15:22
我做的是这个样子,但是和你说的不大一样, 随机生成一个球,如果填不进去就丢掉另外随机生成一个继续填充
...

可以发一下你程序的源代码吗?谢谢

gywxd 发表于 2021-4-8 14:33:01
%球体空间填充
clear;clc;clf;

keytianchong=2;   %填充方式

maxx=10;
maxy=10;
maxz=10;
testnum=2000;   %每个圆尝试次数

failtimes=20;   %失败多少次退出


value=zeros(0,5);
failnum=0;


while  failnum < failtimes

t=randperm(3);   %生成随机圆半径
R=t(1);
% R=3
tmpx=unifrnd (R, maxy-R,1,testnum);
tmpy=unifrnd (R, maxy-R,1,testnum);
tmpz=unifrnd (R, maxz-R,1,testnum);

num=size(value);
num=num(1);


for i=1:testnum
    newx=tmpx(i);
    newy=tmpy(i);
    newz=tmpz(i);
   
    tmpvalue=[newx,newy,newz];
   
    for n=1:1:num-1
        tmpvalue=[tmpvalue;[newx,newy,newz]];   %构建一个和已有圆数量相同的 点矩阵用于计算新点和各圆的距离
    end
   

    tmp=value(:,2:4)-tmpvalue;
   
    tmp=tmp.*tmp;
   
    distance =sum(tmp,2) ;   %对 x y z的平方值按行求和得到各圆和 新圆的距离平方
   
    %画图最小距离要大于两个圆的 半径和
    mixdis=value(:,1)+R;
   
    mixdis=mixdis.*mixdis;  %直接换成平方方便对比
   
    okflag=distance < mixdis; %找到和新的 点 距离小于两个月半径的圆  但凡有一个就无法画新圆
   
    okflag=okflag*1;
    okflag=sum(okflag);
   
    if okflag > 0     
        if i==testnum
            failnum=failnum+1     %失败次数  如果一个新的半径圆填充失败后  计数器加1, 超过几次就停尝试。  
        end
        continue;    %无法画新圆跳出对下一个随机点进行检测
    end
   
    value=[value;[R newx newy newz R]];   %找的新圆保存新圆,退出for循环
    failnum=0;  %成功一次 失败记录清零
    break;           
   
   
end





end

Yakuza 发表于 2021-4-9 09:08:06
本帖最后由 Yakuza 于 2021-4-9 09:19 编辑
gywxd 发表于 2021-4-8 14:33
%球体空间填充
clear;clc;clf;

谢谢您的分享,我仔细学习了您的程序,我也尝试了修改一些参数,有个问题我不明白,希望您能抽时间回复我一下
生成的图像我这里显示空白,我看网上说改数值类型什么的,我没有调出来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表