如何在matlab矩阵中随机生成圆【含源代码】

997f436482bd480c44ab485937e09ab1.png

在本文开始之前,先夹点私货。首先,小编将正式启用巴山作为笔名在matlab爱好者公众号所属账号下撰写推文。其次,matlab爱好者目前在各大自媒体平台都有注册名为matlab爱好者或matlabaihaozhe的账号,但从今天起,将主要在微信知乎B站三个平台上与大家进行交流,在知乎的名称为:matlab爱好者,在B站的名称为matlabaihaozhe。最后,matlab爱好者公众号将清除所有在CSDN平台上发布的博文,一切在CSDN中发布的matlab爱好者发布过的推文都是抄袭搬运,欢迎大家发现后积极举报!

52627522b2406a31a5097daa251303b6.png

言归正传,巴山在浏览知乎时邀请我回答上图所示的问题,所幸就点进去看了一眼,并给了解题思路。

该问题所涉及的知点并不多也不难,主要就是如何生成圆以及矩阵赋值操作。因为矩阵是离散数据集,因此对矩阵的大小要有一定的限制,比如在一个2✖2或5✖5的矩阵中生成随机圆显然是没有意义的。

巴山将按以下步骤来解决该问题:

首先,初始化一定大小元素值全为false的逻辑矩阵JZ,并定义一个取值为0到2π的角theta,定义角是因为圆的参数方程要用到。

其次,随机生成圆心和半径,当然都得在矩阵大小范围内,特别提醒,这里的圆心只能取整数值,因为矩阵索引值不能为小数。

最后,根据半径和圆心生成圆的位置坐标并取整,剔除超过矩阵大小范围的位置,将矩阵中对应位置设置为true即可

以下是main函数及子函数randCircle:

main函数:

% 作者:巴山
% 欢迎关注matlab爱好者公众号


clc;clear;
M = 500;


figure;
JZ  = randCircle(M);
himg = imshow(JZ);
% 更新圆
hold on;
for k = 1:20
    [~,L] = randCircle(M);
    JZ(sub2ind(size(JZ),L(:,2),L(:,1))) = true;
    set(himg,'CData',JZ);
    pause(0.2);
end
hold off;

子函数randCircle:

function [JZ,L] = randCircle(M)


JZ    = false(M,M); 


% 定义圆周角
theta = linspace(0,2*pi,round(M*2));


% 定义随机函数
rfun = @(a,b) a+(b-a)*rand;


% 随机圆心和半径
C    = round([rfun(1,M-1),rfun(1,M-1)]);
R    = rfun(5,M*0.15);


% 生成圆
x    = round(C(2) + R*cos(theta))';
y    = round(C(1) + R*sin(theta))';


% 剔除位置小于0的点
loc  = find((x>0) & (y>0));


[m,n] = size(JZ);
nx   =  x(loc)-n;
ny   =  y(loc)-m;
% 剔除位置超出范围的点
nloc  = find((nx<0) & (ny<0));


% 组合坐标
L  = [ny(nloc)+m, nx(nloc)+n];
L  = unique(L,'rows');
% 将符合条件的位置赋值为true
JZ(sub2ind(size(JZ),L(:,2),L(:,1))) = true;

效果图

0f9b8774a2d70f6af064947c9ec45cab.gif

以上就是今天的全部内容,欢迎大家多多与巴山交流matlab编程。如有不足之处,敬请留言指正!若觉得本文不错,记得点赞和在看哦!

最后,感谢您的阅读!

互动专区

matlab爱好者中回复“QQ”,加入答疑解惑Q群回复原创”,加入原创共享Q群;回复转载获取转载授权!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值