N久之前,咱在公众号中分享了如何用MATLAB实现在指定区域内随机填充圆,并将相关功能封装一个名为randCircle函数里面,其可实现的功能如下:
(1) 设定是否允许填充圆相交、相切或独立存在
(2) 指定区域内圆的生成个数
(3) 设定是否允许圆在边界处穿过边界
(4) 指定圆的填充颜色或随机设定
(5) 指定圆的边框粗细 (可支持无边框)
(6) 指定圆面透明度或随机设定
(7) 支持将生成的图像保存为不同格式的高清图像
拿到源代码的伙伴应该会发现randCircle函数其实或多或少是有些问题的,比如,在处理穿过边界的圆时并不真实对越界部分进行切除而且通过坐标轴限制来移到相应的视区效果。再如,生成的图形会出现“串链”现象,如下图所示:
很显然这与实际的颗粒堆叠或者说分布是不太相符的,更为致命的是仅支持圆的随机填充,对其他更加复杂的几何图形却无能为力。因此,咱决定基于randCircle函数已有算法进行升级优化。
那升级之后有哪些新有亮点呢?下面将一一为大家解读。
亮点1:函数名称由randCircle更改为randFill以便更加符合实际的应用场景;
亮点2:除了可以填充圆外,还支持填充椭圆、多边形以及它们之间的任意组合,可以这么讲任何图形都可以使用randFill来做二维随机填充或堆叠;
亮点3:引入了周期性边界处理方法,能完成处理周期性边界问题;
亮点4:采用图形逻辑处理方法,完美实现边界处图形的裁切操作,所见即所得,而不是像randCircle函数那样通过限制坐标轴区域来实现;
亮点5:摒弃了randCirle中部分不适宜功能,杜绝发生“串链”现象;
亮点6:创建独立的多边形生成函数并将其参数化,原则上可以生成三边及以上边数的任意随机多边形,如边长随机、图形方位随机等;
亮点7:可多维度控制程序终止,如最大执行次数、颗粒数目、面积分数等等;
亮点8:继承了randCircle函数的所有优点并引入多可选设置项,如控制边界区域是否显示。
接下来就一起来看看使用randFill生成的效果图吧:
图2 随机填充圆
图3 随机填充椭圆
图4 随机填多边形
图5 随机填充圆与椭圆
图6 随机填充圆与多边形
图7 随机填充椭圆与多边形
图8 随机填圆、椭圆与多边形
图9 考虑周期性边界的混合填充
实现randFill的算法并不是什么难事,伙伴们稍加努力即可轻松开发出来。
下一版randfill功能预告:
① 支持指定特定分布的填充(如生成半径正态分布的填充图形等)
② 任意区域形状的支持
功能展望:在完美实现二维(2D)空间的所有相关功能后,randFill还将进军三维(3D)空间,实现诸如球体、椭球体、锥体、柱体与多面体等3D图形的随机填充,最终实现2D与3D建模与有限元计算模型联合起来,实现真正的应用。当然,应用场景不限于有限元模拟,其他场景的应用也会逐步开发。划重点:如果相关都得以实现,两三篇SCI都将不是问题。如果您在论文中用到本文的代码,望务必告知咱。
如需本文完整源代码,请关注巴山学长公Z号,回复"填充圆"获取。
感谢您的阅读,有缘再见!