N久之前,咱在公众号中分享了如何用MATLAB实现在指定区域内随机填充圆,并将相关功能封装一个名为randCircle函数里面,其可实现的功能如下:
(1) 设定是否允许填充圆相交、相切或独立存在
(2) 指定区域内圆的生成个数
(3) 设定是否允许圆在边界处穿过边界
(4) 指定圆的填充颜色或随机设定
(5) 指定圆的边框粗细 (可支持无边框)
(6) 指定圆面透明度或随机设定
(7) 支持将生成的图像保存为不同格式的高清图像
拿到源代码的伙伴应该会发现randCircle函数其实或多或少是有些问题的,比如,在处理穿过边界的圆时并不真实对越界部分进行切除而且通过坐标轴限制来移到相应的视区效果。再如,生成的图形会出现“串链”现象,如下图所示:
图1 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及其相关源代码且愿意支持巴山学长公众号发展的伙伴可通过赞赏巴山学长公众号获得。
下一版randfill功能预告:
① 支持指定特定分布的填充(如生成半径正态分布的填充图形等)
② 任意区域形状的支持
功能展望:在完美实现二维(2D)空间的所有相关功能后,randFill还将进军三维(3D)空间,实现诸如球体、椭球体、锥体、柱体与多面体等3D图形的随机填充,最终实现2D与3D建模与有限元计算模型联合起来,实现真正的应用。当然,应用场景不限于有限元模拟,其他场景的应用也会逐步开发。划重点:如果相关都得以实现,两三篇SCI都将不是问题。如果您在论文中用到本文的代码,望务必告知咱。
赞赏及获取源代码获取途径:
如您仅需二维圆随机填充,点击指定区域内随机填充圆之matlab实现即可。
如您需要randfill完整代码且自愿支持巴山学长公众号,请扫描以下二维码完成赞赏后,在公众号回复QQ加群找群主获取:
赞赏77元获当前版本
赞赏99元获取永久2D版
版本说明:当前版本指的是本文所讲的已开发出来的randFill版,永久2D版指的是randFill在二维(2D)空间的所有更新版本。赞赏永久2D版之后,今后2D版的randFill更新都不需要在另行赞赏。
对于之前已经赞赏过随机填充圆的伙伴,如需randFill及其相关代码,在公众号里回复QQ,加群找群主获取,同时需补赞相应差额。
特别说明:若您在学术活动中使用到本文的工作,请注明来源于巴山学长微信公众号 (ID: MrBaShan),并务必告知咱,不胜感激。
如需转载,请在公众号中回复“转载”获取授权,如未经授权擅自搬运抄袭的,本公众号将保留一切追责权利!