言归正传,巴山在浏览知乎时邀请我回答上图所示的问题,所幸就点进去看了一眼,并给了解题思路。
该问题所涉及的知点并不多也不难,主要就是如何生成圆以及矩阵赋值操作。因为矩阵是离散数据集,因此对矩阵的大小要有一定的限制,比如在一个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;
效果图
最后,感谢您的阅读!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有