news 2026/5/1 9:14:11

随机短纤维(线型)与圆形骨料细观模型:可调节参数、纤维三维化及代码修改性研究

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
随机短纤维(线型)与圆形骨料细观模型:可调节参数、纤维三维化及代码修改性研究

随机短纤维(线型)和圆形骨料细观模型,骨料纤维之间不干涉,可调节半径,长度,也可随机半径长度,纤维可修改为3维圆柱,代码可修改性好。

直接上代码吧,咱们今天要搞个能批量生成随机纤维的脚本。先看这个核心函数,保证纤维之间绝对不打架,还能自定义各种参数。这玩意儿改吧改吧直接扔到有限元软件里用都没问题。

先来点硬核的——生成参数的函数。这个generatefiberparams能吐出来一堆随机参数,注意看里面的np.random.uniform,这里玩了个小花招让短纤维长度和半径关联:

def generate_fiber_params(num_fibers, max_radius=0.5, area_size=10): params = [] for _ in range(num_fibers): radius = np.random.uniform(0.1, max_radius) length = np.random.uniform(2*radius, 4*radius) # 长度至少是直径的两倍 angle = np.random.uniform(0, 2*np.pi) params.append((radius, length, angle)) return params

重点是这个长度随机范围,2倍半径起步,防止生成牙签似的畸形纤维。angle参数留着后面计算方向向量用,这样纤维朝向就不会全是一个德性了。

接下来是重头戏——碰撞检测。这个check_overlap函数用了个空间划分的骚操作,把区域划分成网格来加速检测。直接两层循环检测所有纤维会要命,特别是数量多的时候:

def check_overlap(new_fiber, existing_fibers, grid, cell_size): x, y, r = new_fiber[0], new_fiber[1], new_fiber[3] grid_x = int(x / cell_size) grid_y = int(y / cell_size) for i in range(-1, 2): for j in range(-1, 2): if (grid_x+i, grid_y+j) in grid: for fiber in grid[(grid_x+i, grid_y+j)]: dx = x - fiber[0] dy = y - fiber[1] if dx**2 + dy**2 < (r + fiber[3])**2: return True return False

注意这里判断距离用的是平方比较,比开根号快不止一个量级。网格划分的cell_size建议设成最大纤维直径的1.5倍,这样基本不会漏检。

三维扩展其实特简单,把z坐标加进来,判断距离时多加个dz²就行。不过可视化得用Mayavi或者PyVista了,matplotlib的3D功能太弱鸡。比如这样改造成圆柱体:

class Fiber3D: def __init__(self, start, end, radius): self.start = np.array(start) self.end = np.array(end) self.radius = radius self.axis = self.end - self.start self.length = np.linalg.norm(self.axis) def to_mesh(self): # 返回三角面片数据,用于导出或可视化 cylinder = pv.Cylinder(self.start, self.axis, self.radius, self.length) return cylinder

参数化设计才是精髓。在脚本开头定义这几个全局变量,想怎么改就怎么改:

CONFIG = { 'domain_size': (50, 50, 50), # 三维区域尺寸 'radius_range': (0.2, 1.0), # 半径随机范围 'aspect_ratio': (3, 8), # 长径比范围 'max_attempts': 100 # 单个纤维的最大尝试次数 }

遇到生成失败的情况别慌,加个尝试次数限制。当连续100次都找不到合适位置时,自动停止生成,避免死循环。实测在纤维体积占比30%以下时基本都能成功生成。

最后说下怎么导出数据。建议保存成CSV或者JSON,这样其他软件好读取。比如:

def save_to_csv(fibers, filename): with open(filename, 'w') as f: f.write("x,y,z,dx,dy,dz,radius\n") for fiber in fibers: line = f"{fiber.start[0]},{fiber.start[1]},{fiber.start[2]},"\ f"{fiber.axis[0]},{fiber.axis[1]},{fiber.axis[2]},"\ f"{fiber.radius}\n" f.write(line)

这个格式直接把纤维起点和方向向量都记录下来了,拿到ABAQUS或者COMSOL里用矢量数据直接生成圆柱体,爽歪歪。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 18:48:34

Arduino IDE安装操作指南:专为信息技术课设计

Arduino IDE 安装全攻略&#xff1a;为信息技术课量身打造的“零失败”实践指南 在一间初中的信息技术课堂上&#xff0c;老师正准备带领学生完成人生中第一个硬件编程项目——让LED灯闪烁。然而&#xff0c;30台电脑里有近一半的学生卡在了第一步&#xff1a; Arduino IDE装…

作者头像 李华
网站建设 2026/4/28 17:36:50

CubeMX安装过程中Pack更新失败解决方案

CubeMX 安装卡在 Pack 更新&#xff1f;一招离线导入彻底解决 你是不是也遇到过这种情况&#xff1a;兴冲冲地下载完 STM32CubeMX&#xff0c;打开软件准备新建项目&#xff0c;结果一搜索芯片——啥也没有&#xff1f;或者弹出“Update failed”、“Connection timeout”&…

作者头像 李华
网站建设 2026/5/1 6:48:13

Notion知识库共建:收集用户反馈并持续改进产品体验

Notion知识库共建&#xff1a;收集用户反馈并持续改进产品体验 在企业知识管理的日常实践中&#xff0c;我们常常面临一个尴尬的局面&#xff1a;大量的技术文档、会议纪要和操作手册堆积如山&#xff0c;但真正需要时却“看得见、找不到、用不上”。员工频繁重复提问&#xff…

作者头像 李华
网站建设 2026/5/1 9:07:03

No.883 S7-200 PLC与组态王分拣大小球:颜色、大小、材质的自动化控制

No.883 基于S7-200 PLC和组态王大小球颜色大小材质分拣车间里那堆混在一起的小铁球和塑料球看得人头皮发麻&#xff1f;今天带兄弟们盘盘怎么用西门子S7-200PLC和组态王搞个智能分拣系统。这玩意儿看着唬人&#xff0c;其实拆开了也就几个关键模块&#xff0c;咱边撸代码边唠。…

作者头像 李华
网站建设 2026/5/1 6:48:55

计费计量接口预留:为后续商业化token售卖做准备

计费计量接口预留&#xff1a;为后续商业化token售卖做准备 在AI应用从“能用”迈向“可运营”的今天&#xff0c;一个看似不起眼的技术决策&#xff0c;往往决定了产品未来的商业天花板。比如你开发了一款基于RAG架构的智能知识助手&#xff0c;用户反馈极佳&#xff0c;准备上…

作者头像 李华
网站建设 2026/5/1 6:14:21

OllyDbg用户态调试实战案例:逆向简单 CrackMe 程序

用 OllyDbg 破解一个简单的 CrackMe&#xff1a;从零开始的逆向实战 你有没有想过&#xff0c;软件是怎么“认出”你是正版用户还是盗版用户的&#xff1f; 又或者&#xff0c;当你输入错误密码时&#xff0c;程序背后究竟执行了哪些判断逻辑&#xff1f; 今天&#xff0c;我…

作者头像 李华