You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中2D多边形四边形网格划分的实现方法及替代方案咨询

Python中2D多边形四边形网格划分的实现方法及替代方案咨询

嗨,我来帮你梳理下Python里实现类似Rhino QuadRemesh效果的2D多边形四边形网格划分方案,以及一些能优化现有结果的思路~

一、直接生成四边形网格的Python工具

这些库可以直接从2D多边形生成高质量四边形网格,不用先转三角再优化,效果更接近Rhino的输出:

1. pygmsh(基于Gmsh的Python绑定)

Gmsh是工程领域常用的专业网格生成器,对2D多边形(带凹口、孔洞都支持)的四边形网格适配性很强,能生成结构化或非结构化的规整四边形网格。

示例代码参考:

import pygmsh

# 定义带凹口的2D多边形顶点
polygon_points = [
    [0.0, 0.0, 0.0], [5.0, 0.0, 0.0], [5.0, 3.0, 0.0],
    [3.0, 3.0, 0.0], [3.0, 1.0, 0.0], [2.0, 1.0, 0.0],
    [2.0, 3.0, 0.0], [0.0, 3.0, 0.0]
]

with pygmsh.geo.Geometry() as geom:
    # 创建多边形曲线环
    poly_loop = geom.add_polygon(polygon_points, mesh_size=0.4)
    # 配置网格参数:强制生成四边形主导网格
    geom.add_raw_code("Mesh.Algorithm = 8;")  # Frontal-Delaunay算法,适合非结构化四边形
    geom.add_raw_code("Mesh.RecombineAll = 1;")  # 自动合并符合条件的三角为四边形
    geom.add_raw_code("Mesh.RecombineAngleThreshold = 170;")  # 仅合并夹角接近平角的三角对

    # 生成网格
    mesh = geom.generate_mesh()

# 提取四边形网格数据
quad_faces = [face for face in mesh.cells if face.type == "quad"]
vertices = mesh.points

小提示:调整mesh_size控制网格密度,Mesh.RecombineAngleThreshold可以过滤掉畸形的四边形合并,数值越接近180,生成的四边形越规整。

2. COMPAS Singular

如果你已经在使用COMPAS生态(比如之前用的compas_CGAL),那compas_singular绝对是首选——它专门针对建筑、几何设计领域的四边形网格需求,能从任意2D多边形生成结构化的高质量四边形网格,算法逻辑和Rhino QuadRemesh高度契合。

简化版示例代码:

from compas.geometry import Polygon
from compas_singular.algorithms import quad_mesh_from_polygon

# 定义2D多边形(支持带孔洞的复杂多边形)
polygon = Polygon([(0,0), (6,0), (6,4), (2,4), (2,2), (4,2), (4,4), (0,4)])

# 生成四边形网格,density控制网格细分数量
quad_mesh = quad_mesh_from_polygon(polygon, density=6)

# 导出为OBJ格式或直接可视化
quad_mesh.to_obj("output_quad_mesh.obj")

我之前用它处理过带多个孔洞的不规则多边形,生成的网格规整度比三角转四边形好太多,完全能满足设计类场景的需求。

二、优化三角转四边形的效果

如果还是想沿用三角转四边形的思路,试试这些优化技巧,能大幅提升结果质量:

  • 先修复三角网格拓扑:用meshfix清理三角网格中的非流形边、重复顶点、孤立面,再进行合并,避免畸形四边形:
    from meshfix import MeshFix
    import trimesh
    
    # 加载你的三角网格
    tri_mesh = trimesh.load("triangulated_mesh.obj")
    # 修复网格拓扑问题
    mf = MeshFix(tri_mesh.vertices, tri_mesh.faces)
    mf.repair()
    cleaned_verts, cleaned_faces = mf.mesh
    # 合并三角为四边形
    clean_tri_mesh = trimesh.Trimesh(cleaned_verts, cleaned_faces)
    quad_mesh = clean_tri_mesh.quad_mesh(angle_threshold=175, edge_length_threshold=0.05)
    
  • 手动筛选合格四边形:合并后过滤掉内角偏差过大(比如小于30度或大于150度)的四边形,再用三角网格补全空缺,平衡规整度和完整性。

三、替代方案:直接调用Rhino QuadRemesh API

如果Python原生库的效果还是达不到你的预期,直接调用Rhino的官方API是最稳妥的——毕竟你要的就是和Rhino完全一致的效果:

  • 本地调用:如果你本地安装了Rhino,可以用rhino3dm配合rhinoscriptsyntax,在Python脚本里直接调用Rhino的QuadRemesh命令,完全复刻界面操作的结果;
  • 云端调用:用compute.rhino3d(McNeel官方推出的云端Rhino服务),把多边形数据发送到云端服务,调用QuadRemesh后返回四边形网格数据,适合没有本地Rhino的场景。

最后碎碎念

如果是做设计类项目,优先选compas_singular或调用Rhino API;如果是工程仿真类场景,pygmsh的灵活性和精度会更合适。你可以根据自己的多边形复杂度(有没有孔洞、凹口)和需求(规整度/速度)来选择~

火山引擎 最新活动