通化网站制作宿迁公司企业网站建设
2026/4/8 18:45:58 网站建设 项目流程
通化网站制作,宿迁公司企业网站建设,山东省和住房城乡建设厅网站首页,代理平台不再运营游戏随机短纤维#xff08;线型#xff09;和圆形骨料细观模型#xff0c;骨料纤维之间不干涉#xff0c;可调节半径#xff0c;长度#xff0c;也可随机半径长度#xff0c;纤维可修改为3维圆柱#xff0c;代码可修改性好。 直接上代码吧#xff0c;咱们今天要搞个能批量…随机短纤维线型和圆形骨料细观模型骨料纤维之间不干涉可调节半径长度也可随机半径长度纤维可修改为3维圆柱代码可修改性好。直接上代码吧咱们今天要搞个能批量生成随机纤维的脚本。先看这个核心函数保证纤维之间绝对不打架还能自定义各种参数。这玩意儿改吧改吧直接扔到有限元软件里用都没问题。先来点硬核的——生成参数的函数。这个generatefiberparams能吐出来一堆随机参数注意看里面的np.random.uniform这里玩了个小花招让短纤维长度和半径关联def generate_fiber_params(num_fibers, max_radius0.5, area_size10): 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_xi, grid_yj) in grid: for fiber in grid[(grid_xi, grid_yj)]: 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里用矢量数据直接生成圆柱体爽歪歪。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询