基本思想
- 每次随机指定一个半径和位置,如果不和任意一个小球相交,则将其添加到可以被显示的小球的列表中,如果某个小球添加了很多次都没有添加成功,则停止添加
代码
主函数
%% 随机生成互不相交的圆
figure
axis equal
hold on
% circleFcn(0, 0, 2)
maxFailCnt = 1000;
failCnt = 0;
xyl = [];
rl = [];
containerRadi = 2.9;
maxRadi = 0.4;
canAdd = true;
tic
circleFcn(0, 0, containerRadi)
while failCnt < maxFailCnt
canAdd = true;
r = rand() * maxRadi;
rA = rand() * 2 * pi;
rR = rand() * (containerRadi - r);
x = rR * cos( rA );
y = rR * sin( rA );
for ii = 1:size(xyl, 1)
if norm( xyl(ii,:) - [x y]) < rl(ii)+r
canAdd = false;
break;
end
end
if canAdd
xyl = [xyl ; x y];
rl = [rl r];
circleFcn( x, y, r );
else
failCnt = failCnt + 1;
end
end
toc
画圆的函数
function circleFcn( x, y, r )
rectangle('position', [x-r, y-r 2*r 2*r], 'Curvature',[1 1])
end