前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在matlab矩阵中随机生成圆【含源代码】

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

作者头像
巴山学长
发布2021-03-30 11:39:16
1.9K0
发布2021-03-30 11:39:16
举报
文章被收录于专栏:巴山学长巴山学长

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

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

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

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

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

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

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

main函数:

代码语言:javascript
复制
% 作者:巴山
% 欢迎关注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:

代码语言:javascript
复制
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;

效果图

最后,感谢您的阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 巴山学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档