咨询:如何获取图示矩形区域的Mesh网格?附矩形网格划分示例
嘿,我来帮你搞定二维区域的网格划分问题!先从你提到的简单矩形区域入手,再聊聊如何处理类似你图中所示的自定义区域~
一、简单矩形区域的Mesh网格生成
1. 结构化网格(规则网格,适配流场图绘制)
如果只是需要规则的矩形网格来配合streamplot绘制流场,用numpy就能快速生成,这种网格每个单元都是规整的矩形,可视化适配性极强。示例代码如下:
import numpy as np import matplotlib.pyplot as plt # 定义矩形区域范围:x轴0-5,y轴0-3 x_min, x_max = 0, 5 y_min, y_max = 0, 3 # 定义网格密度:x方向20个节点,y方向15个节点 nx, ny = 20, 15 # 生成网格点矩阵 x_nodes = np.linspace(x_min, x_max, nx) y_nodes = np.linspace(y_min, y_max, ny) X, Y = np.meshgrid(x_nodes, y_nodes) # 可选:可视化网格 plt.figure(figsize=(8, 5)) plt.scatter(X, Y, s=12, c='#2e8b57') plt.xlabel('X') plt.ylabel('Y') plt.title('结构化矩形网格') plt.grid(alpha=0.3) plt.show()
生成的X和Y可以直接传入plt.streamplot(X, Y, U, V)(其中U、V是对应网格点的流速分量),完美适配流场图绘制。
2. 非结构化网格(适用于数值模拟)
如果需要用于有限元/有限体积法等数值计算的非结构化网格,可以用开源网格生成器gmsh的Python绑定pygmsh来生成,灵活性更强。示例代码:
import pygmsh # 初始化几何模型 with pygmsh.geo.Geometry() as geom: # 添加矩形区域:左下角(0,0),右上角(5,3) rectangle = geom.add_rectangle(xmin=0, xmax=5, ymin=0, ymax=3, z=0) # 设置网格尺寸(数值越小,网格越密) geom.set_mesh_size(rectangle, 0.3) # 生成网格 mesh = geom.generate_mesh() # 提取网格节点和单元信息 nodes = mesh.points # 所有节点的坐标 triangle_cells = mesh.cells_dict['triangle'] # 三角形网格单元的节点索引 # 可选:保存为VTK格式,用ParaView等工具查看 mesh.write('rectangle_unstructured_mesh.vtk')
二、自定义复杂区域(对应你图中所示区域)的网格生成
假设你提到的图是带有不规则边界、孔洞或障碍物的复杂区域,这类场景的核心是先精准定义区域边界,再让网格生成器在边界内填充网格:
方法1:代码定义边界(以矩形挖去圆形障碍物为例)
用pygmsh的布尔运算可以快速实现带孔洞的区域网格:
import pygmsh with pygmsh.geo.Geometry() as geom: # 外层矩形区域 outer_rect = geom.add_rectangle(0, 5, 0, 3, 0) # 内层圆形障碍物:圆心(2.5,1.5),半径0.5 inner_circle = geom.add_circle([2.5, 1.5, 0], 0.5) # 布尔差运算:矩形减去圆形,得到带孔洞的目标区域 geom.boolean_difference([outer_rect], [inner_circle]) # 全局设置网格尺寸 geom.set_mesh_size(geom.get_entities(), 0.2) # 生成网格 mesh = geom.generate_mesh() # 保存网格文件 mesh.write('complex_domain_mesh.vtk')
方法2:基于图像轮廓提取边界
如果你的区域是从图像中获取的,可以先用OpenCV提取区域的轮廓坐标,再将轮廓导入gmsh或meshpy等库生成网格,步骤大概是:
- 读取图像并二值化,区分区域内外
- 用
cv2.findContours()提取区域边界的坐标点 - 将坐标点转换为网格生成器支持的边界曲线,再生成网格
关键小提示
- 仅用于
streamplot的话,结构化网格完全足够,生成简单且适配性拉满; - 数值模拟场景优先选非结构化网格,能完美贴合复杂边界;
- 调整网格尺寸参数时,要平衡计算精度和运行效率——网格越密精度越高,但计算量也会指数级上升。
内容的提问来源于stack exchange,提问作者user7245724
相关产品推荐
相关产品推荐

