使用MATLAB在给定矩形区域随机绘制任意个不相交的圆

时间:2024-03-31 22:37:19

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)

显示:

使用MATLAB在给定矩形区域随机绘制任意个不相交的圆

一个简单的功能就实现了,当然还有一些不完美的地方。

任意个是存在疑问的,N的值根据矩形的面积和内接圆的面积,是有限制关系的。给定一个矩形和半径为R的圆,最大可以放置几个圆的问题超过本文讨论了。为了保证程序征程执行,本文的N值最大设定为:

Nmax = min{[S/(4*R*R)],[a/(2*R)] *[b/(2*R)]};

Nmin = 1;

S为矩形区域的面积,R为小圆的半径,a和b分别为矩形的边长,[~]表示取整。