MATLAB操作简单,上手容易,编写算法也快,最近朋友在学习MATLAB,作为使用了matlab六七年的我,写篇博客来解决一下他提出的问题。
如题目所示,给定区域随机生成,这是两个问题,但是在MATLAB中,使用一条函数来解决:X=X1+(X2-X1)*rand,这样就能生成一条从X1点到X2点的随机数,平面区域的话,增加一个维度就可以。
任意个:每一个运行函数肯定不是任意的,给定一个参数N,来表示每次要生成的圆的个数。
不相交的圆,判断条件为圆心距离大于2*R(R为给定半径)。
如何使用圆心和半径来绘制一个圆:百度得到使用rectangle函数。rectangle函数实际上是一个画矩形的行数,要注意两个参数设置就可以了:(1)rectangle('Position',[x,y,w,h]),表示的是下哦那个点(x,y)开始画一个宽w高h的矩形。默认情况下是从(0,0)开始画一个宽1高1的矩形;(2)rectangle函数可以制定矩形边的曲率,改变曲率的参数是'Curvature',[x,y] ,要画圆的话只需要将曲率设置成1就行了,两边曲率都要设置为1。于是类似这样:
rectangle('Position',[0,0,1,1],'Curvature',[1,1]),axis equal
完成一个标准的圆。如果已知圆心坐标(x,y)和半径r画圆的话,rectangle函数的未知参数应该为 'Position',[x-r,y-r,2*r,2*r] 。
整体思路为:1.先生成间距大于2*R的N个点:每一个点生成之后,都要和之前的点进行举例判断,如果全部满足大于2*R,则继续生成下一个点;如果不满足距离要求,则重新生成这个点,直到满足距离要求为止。
2.根据生成的N个随机点,作为圆心坐标进行绘制圆,即调用rectangle函数。
以下为代码:
function plotNcircle_in_rect(X1,X2,Y1,Y2,N,R)
%plotNcircle_in_rect(X1,X2,Y1,Y2,N,R) 函数说明:
% 此函数用来会绘制 N 个矩形区域里面随机生成的半径为 R 的圆,矩形区域为(X1,Y1)->(X2,Y2)
% 输出是一张plot绘制的图,
X=zeros(1,N);
Y=zeros(1,N);
i=1;
while(i<=N)
X(i)=X1+X2*rand;
Y(i)=Y1+Y2*rand;
if(i>=2)
for j=i:-1:1
if(j==1)
i=i+1;
continue;
else
dis = sqrt((X(i)-X(j-1))^2 + (Y(i)-Y(j-1))^2);
if(dis<2*R)
i=i-1;
break;
end
end
end
else
i=i+1;
end
end
for i=1:1:N
myplotcircle(X(i),Y(i),R);
hold on
end
上述调用了myplotcircle这个自己定义的函数,实际上就是参数封装rectangle函数,调用起来直观一点:
function myplotcircle(x,y,r)
%UNTITLED 此处显示有关此函数的摘要
% 此处显示详细说明
rectangle('Position',[x-r,y-r,2*r,2*r],'Curvature',[1,1]);
axis equal
end
例子:
plotNcircle_in_rect(-10,10,0,10,50,0.3)
显示:
一个简单的功能就实现了,当然还有一些不完美的地方。
任意个是存在疑问的,N的值根据矩形的面积和内接圆的面积,是有限制关系的。给定一个矩形和半径为R的圆,最大可以放置几个圆的问题超过本文讨论了。为了保证程序征程执行,本文的N值最大设定为:
Nmax = min{[S/(4*R*R)],[a/(2*R)] *[b/(2*R)]};
Nmin = 1;
S为矩形区域的面积,R为小圆的半径,a和b分别为矩形的边长,[~]表示取整。