之前有伙伴在QQ交流群里询问如何在matlab中编程实现上图所示,刨去图中所有修饰,这个听起来相对高级的颗粒堆叠非均相模型实则就是在矩形区域随机填充不同半径大小的圆。再更进一步抽象此问题,就是如何在matlab中绘制圆。那么问题来了,如何唯一表征一个圆呢?
圆的特征要素即圆心与半径,只要知道这两要素即可表征圆,那怎么在matlab中画圆呢?在matlab画圆的方法多种多样,如函数plot、line、rectangle、patch与fill等都可以用于绘制圆。
% 用line函数绘制圆示例
t = linspace(0,2*pi,200);
xc = 0.5;
yc = 0.5;
r = 1.5;
x = xc+r*cos(t);
y = yc+r*sin(t);
line(x,y);
现在已经知道如何画圆了,但图中圆的圆心位置与半径都是各不相同的,为了达到这一效果,matlab中的伪随机数生成器rand函数就可以上场了。通过对rand函数稍加改造,不仅可以随机生成圆的位置,还可以随机设置圆的半径。实现原理非常简单,这里就不再赘诉。小编经过琢磨,将相关功能集成到了名为randCircle的函数中,randCircle函数具有如下功能:
(1) 设定是否允许填充圆相交、相切或独立存在
(2) 指定区域内圆的生成个数
(3) 设定是否允许圆在边界处穿过边界
(4) 指定圆的填充颜色或随机设定
(5) 指定圆的边框粗细 (可支持无边框)
(6) 指定圆面透明度或随机设定
(7) 支持将生成的图像保存为不同格式的高清图像
除了在功能方面表现,randCircle函数的编写上也下足功夫,如
默认输入参数设置
、
输入参数有效性验证
、
检查是否包含无法识别的参数
等matlab函数编写等基本功也是应有尽有,本程序可以为编写其他matlab函数作为参考模版用。本程序执行效率高,在指定区域生成2000个圆,小编的测试结果显示仅需3秒左右。当然,若要保存图片,运行时间会有增加。
主函数:main.m
tic;
clc;clear;close all;
% 宽高
C.wh = [80, 60];
% 半径范围
C.rlim = [0.5, 1.5];
% 定义区域内圆个数
C.num = 2000;
% 最大尝试次数
% C.N = 100;
% 是否随机填充圆面颜色
C.colormType = false;
% 圆面边框粗细
C.linewidth = 0.75;
% 圆面透明度
C.alpha = 1;
% 是否允许圆穿过边界
C.edgeType = true;
% 是否允许重叠
C.overlap = false;
% 是否允许相切
C.tangent = true;
% 是否保存图像
C.isprint = false;
% 图像名称
C.imgname = strcat('matlab爱好者9527');
% 图像格式
C.imgType = '-dpng';
% 图像分辨率
C.imgdpi = 300;
[rinfo,C] = randCircle(C);
toc;
以下给出两组效果图:
(随机填充颜色且不允许圆穿过边界)
(指定填充颜色且允许圆穿过边界)
当然此功能相对初级,小伙们可根据此版本作为母版进行后续升级,包括可指定任意区域形状、可填充除圆以外的其他图形、指定特定分布的填充(如生成半径正态分布的填充图形等)、三维空间中的随机填充等等。
需要源代码请关注
懂科学的程序员公众号
,谢谢!
特别说明:若您在学术活动中使用到本文的工作,请注明来源于
懂科学的程序员
,不胜感激。