You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:如何获取图示矩形区域的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:16:14