言归正传,巴山在浏览知乎时邀请我回答上图所示的问题,所幸就点进去看了一眼,并给了解题思路。
该问题所涉及的知点并不多也不难,主要就是如何生成圆以及矩阵赋值操作。因为矩阵是离散数据集,因此对矩阵的大小要有一定的限制,比如在一个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;
效果图
最后,感谢您的阅读!