如何用MATLAB在指定范围内生成多个互不重叠的二维随机坐标

如何用MATLAB在指定范围内生成多个互不重叠的二维随机坐标

  1. 笔者做实验仿真时遇到了这个问题,然后查阅了很多有关MATLAB生成不重叠的随机数的博客,但关于互不重叠的二维随机坐标的方法很少见,因此分享一下我的解决方案(因为方法是一步步摸索来的,所以整体从问题背景开始分成了4步来分析的)。
  2. 当坐标点的可选范围足够小时,随机取点容易出现重叠现象,重点就在于“互不重叠”,对于二维坐标,互不重叠就意味着横纵坐标都不能同时相等。

1)问题背景

  1. 第一步 假设存在以坐标原点为中心、面积为10×10平方千米的区域,该区域最初仅具有10个红色方块,其随机分布。但我们决定将所有方块放置于该区域中心的5×5平方千米区域内。

  2. 解决方法 这个问题很简单,使用rand()方法即可。在MATLAB中,rand函数产生由在(0, 1)之间均匀分布的随机数组成的数组。
    如果要求在区间(a,b)内产生m行n列的随机数r = a + (b-a).*rand(m,n)。

  3. MATLAB 程序如下:

%图一
x1=rand(10,1)*5000-2500;  %横坐标在(-2500,2500)范围内,生成1*10的随机矩阵
y1=rand(1,10)*5000-2500;  %纵坐标在(-2500,2500)范围内,生成1*10的随机矩阵
figure(1)
plot(x1,y1,'s','color','r')   %以x1为横坐标,y1为纵坐标绘制红色方块点图
rectangle('position',[-2500 -2500 5000 5000],'LineWidth',2,'LineStyle','--');  %中心区域的虚线框
hold on 
set(gca,'XLim',[-5000 5000]);        %X轴的数据显示范围
set(gca,'XTick',[-5000:1000:5000]);  %设置要显示的坐标刻度
set(gca,'YLim',[-5000 5000]);        %Y轴的数据显示范围
set(gca,'YTick',[-5000:1000:5000]);  %设置要显示的坐标刻度
  1. 结果图如下:
    随机生成的10个方块

2)在背景基础上继续添加不同类别的随机坐标

  1. 第二步 在第一步的基础上,再于中心虚线范围内随机生成60个蓝色圆点(由于随机取点的范围较大,此处圆点几乎不会出现重叠现象,因此程序中直接使用随机函数)。

  2. MATLAB 程序如下:

%图二
x2=rand(60,1)*5000-2500;  %横坐标在(-2500,2500)范围内,生成1*60的随机矩阵
y2=rand(1,60)*5000-2500;  %纵坐标在(-2500,2500)范围内,生成1*60的随机矩阵
figure(2)
plot(x1,y1,'s','color','r')  %以x1为横坐标,y1为纵坐标绘制红色方块点图
hold on
plot(x2,y2,'o')  %以x2为横坐标,y2为纵坐标绘制蓝色圆圈点图
rectangle('position',[-2500 -2500 5000 5000],'LineWidth',2,'LineStyle','--');  %中心区域的虚线框
set(gca,'XLim',[-5000 5000]);        %X轴的数据显示范围
set(gca,'XTick',[-5000:1000:5000]);  %设置要显示的坐标刻度
set(gca,'YLim',[-5000 5000]);        %Y轴的数据显示范围
set(gca,'YTick',[-5000:1000:5000]);  %设置要显示的坐标刻度
xlabel('x','FontSize',15);ylabel('y','FontSize',15)
  1. 结果图如下:
    再随机生成60个圆圈
  2. 上述步骤都很简单,但是如果给蓝色圆点的坐标可行域提出限制,就有一定难度了。

3)限定随机点的可行域

  1. 第三步 要求蓝色圆点的坐标要有一定的规则性,将中心的5*5平方千米区域均分为100个网格,每个网格的边长为500米,此时蓝色圆点只能分布于各网格的中心,即圆点的可选位置只有100个,我们需要从中随机选出60个位置(100选60非常容易出现重叠现象)。

  2. 初步想法 笔者仍想用前两步的做法来实现第三步,每个圆点的横、纵坐标固定于(-2250,-1750,-1250,-750,-250,250,750,1250,1750,2250)这几个点,这些坐标的最大公约数为250,即((-4,5).*2-1).*250,其中数列(-4,5 )取整,公差为1。

  3. MATLAB 部分程序如下:

%图三
x3=((round(rand(1,60)*9)-4)*2-1)*250;
y3=((round(rand(1,60)*9)-4)*2-1)*250;
  1. 这样写可以实现蓝色圆点的坐标要求,但由于100选60,十分容易出现重叠现象,往往图中只显示不到60个的坐标点。

  2. 结果图如下:
    在这里插入图片描述

  3. 显而易见,这样的结果不是我们想要得到的,因此笔者放弃上述做法,选择4)的做法实现。

4)采用randperm()函数实现目标

  1. 笔者采用randperm()函数、for循环和if条件语句解决上述问题。randperm()函数用于随机打乱一个数字序列。

  2. MATLAB 程序如下:

%图三(2)
figure(4)
plot(x1,y1,'s','color','r')  %以x1为横坐标,y1为纵坐标绘制红色方块点图
hold on
x4=(-2250:500:2250);  %x3位于(-2250,2250)范围,以500为步长
y4=(-2250:500:2250);  %y3位于(-2250,2250)范围,以500为步长
z=[ones(1,60),zeros(1,100-60)];  %z为一行有60个"1"、40个"0"的矩阵
z=z(randperm(100))  %将z中的100个数据随机打乱
for i=1:10
    for j=1:10
        if z((i-1)*10+j)==1  %判断元素是否为"1"            
            plot(x4(i), y4(j), 'o');  %输出所有为"1"的坐标点,显示为蓝色圆点
            hold on;
        end
    end
end
rectangle('position',[-2500 -2500 5000 5000],'LineWidth',2,'LineStyle','--');  %中心区域的虚线框
set(gca,'XLim',[-5000 5000]);       %X轴的数据显示范围
set(gca,'XTick',[-5000:1000:5000]); %设置要显示的坐标刻度
set(gca,'YLim',[-5000 5000]);       %Y轴的数据显示范围
set(gca,'YTick',[-5000:1000:5000]); %设置要显示的坐标刻度
xlabel('x','FontSize',15);ylabel('y','FontSize',15)
  1. 结果图如下:
    在这里插入图片描述

结语

  1. 这个问题背景出自笔者的仿真实验,我认为在指定范围内生成多个互不重叠的二维随机坐标的问题也可以用这种方法统一解决。
  2. 这是我第一次写博客,很多地方可能不够严谨不够专业,望小伙伴们多多包涵,如有错误欢迎指出~
  • 59
    点赞
  • 196
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值