Python实现复合材料随机骨料生成算法解析
1. 项目背景与核心价值在土木工程、材料科学等领域复合材料微观结构的数值模拟需要大量随机分布的骨料模型。传统CAD软件中手动绘制这些骨料效率极低而商业软件又往往价格昂贵且功能冗余。这个Python程序正是为解决这一痛点而生——它能自动生成符合指定参数如粒径分布、体积分数的随机多边形骨料并输出为CAD兼容格式。我最初开发这个工具是为了完成自己的硕士课题当时需要建立数百个不同配比的混凝土细观模型。手动操作几乎不可能完成而现有工具要么功能单一要么学习成本太高。经过两个月的迭代优化最终形成的这个脚本已经在我们实验室广泛使用累计生成了超过5000组骨料模型。2. 核心算法解析2.1 随机多边形生成原理程序采用射线法生成凸多边形在单位圆上随机选取n个点n5~8计算这些点的凸包作为初始形状通过随机缩放各边长度实现不规则度控制关键参数说明def generate_polygon(center, avg_radius, irregularity, spikiness, num_vertices): center: 形心坐标 avg_radius: 平均半径(mm) irregularity: [0,1]控制边长度变异程度 spikiness: [0,1]控制角度变异程度 num_vertices: 顶点数(建议5-8) 2.2 随机分布算法采用顺序增加法避免骨料重叠初始化空域和已放置骨料列表按粒径从大到小顺序尝试放置每个骨料进行100次随机位置尝试通过AABB碰撞检测判断重叠优化技巧采用四叉树空间分区加速碰撞检测对失败的小骨料允许适度重叠(可设阈值)边界处采用镜像法保证均匀性3. 完整实现流程3.1 环境配置需要安装以下Python库pip install numpy matplotlib shapely dxfwrite3.2 参数配置文件建议使用YAML文件管理参数# config.yaml particle: min_radius: 2.0 # 最小粒径(mm) max_radius: 10.0 # 最大粒径(mm) gradation: [0.3, 0.5, 0.2] # 粒径级配(小/中/大) domain: size: [100, 100] # 区域尺寸(mm) volume_ratio: 0.4 # 骨料体积分数3.3 核心代码实现主要处理流程def main(): config load_config(config.yaml) particles [] # 按级配生成不同粒径骨料 for size_group in config[gradation]: radius_range (...) count calculate_particle_count(...) for _ in range(count): while True: # 尝试放置骨料 new_poly generate_polygon(...) if not check_collision(new_poly, particles): particles.append(new_poly) break # 输出DXF文件 export_to_dxf(particles, output.dxf)4. 高级功能扩展4.1 多相材料支持通过标签区分不同材质class Particle: def __init__(self, vertices, material_type): self.vertices vertices self.material material_type # 0骨料, 1界面层, 2孔隙4.2 三维扩展思路将二维算法扩展到三维的方法用凸多面体代替多边形采用八叉树进行空间划分使用VTK库进行可视化5. 常见问题与优化建议5.1 性能优化记录测试数据100x100mm区域骨料数量原始算法(s)四叉树优化(s)20012.43.250068.78.9优化方法将碰撞检测复杂度从O(n²)降到O(nlogn)采用numba加速数值计算并行化位置尝试过程5.2 实际应用建议教学演示降低粒径差异使用规则形状科研模拟建议设置5%重叠容差工程应用导出时添加材料属性标记关键提示当体积分数0.45时建议分阶段生成先放置大骨料体积分数0.3再填充中小骨料补充剩余体积6. 输出格式与应用支持多种CAD格式导出DXF最通用SVG用于网页展示JSON用于后续数值分析在ANSYS中的应用示例/prep7 ! 导入骨料轮廓 CDREAD, output.dxf ! 对每个面进行网格划分 AMESH, ALL这个工具目前已经集成到我们实验室的自动化流程中与FEM分析软件形成完整的工作链。通过调整参数配置可以快速生成不同级配的骨料模型大大提升了研究效率。对于有特殊需求的用户建议从修改config.yaml文件开始逐步熟悉各参数的影响规律。