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

Python Openmesh如何判断共边三角面法线是否平行?

Python OpenMesh 判断共享边的两个三角形法线是否平行

OpenMesh本身没有直接提供判断两个三角形法线平行的内置方法,但你用法线点积的思路是完全可行的,下面是便捷的实现方式:

  • 第一步:获取共享边的两个相邻三角形
    OpenMesh中,非边界边会关联两个面,通过mesh.fh(eh)可以获取边eh对应的面迭代器,将其转为列表即可得到两个面的handle。

  • 第二步:计算每个三角形的法线
    使用OpenMesh内置的mesh.calc_face_normal(fh)方法,该方法会返回归一化后的面法线向量(Vec3f类型)。

  • 第三步:通过点积判断平行性
    两个单位法线向量的点积绝对值接近1时,说明它们平行(考虑浮点数精度误差,需要设置一个小阈值,比如1e-6)。

代码实现示例

import openmesh as om

def are_adjacent_faces_parallel(mesh, edge_handle):
    # 边界边只有一个相邻面,直接返回False
    if mesh.is_boundary(edge_handle):
        return False
    
    # 获取边对应的两个相邻面
    adjacent_faces = list(mesh.fh(edge_handle))
    if len(adjacent_faces) != 2:
        return False
    
    # 计算两个面的法线
    normal1 = mesh.calc_face_normal(adjacent_faces[0])
    normal2 = mesh.calc_face_normal(adjacent_faces[1])
    
    # 计算点积绝对值,判断是否平行
    dot = normal1.dot(normal2)
    # 考虑浮点数精度,用阈值判断
    return abs(dot) > 1.0 - 1e-6

补充说明

  • 四边形被拆分后的两个三角形,法线要么完全同向(点积为1),要么反向(点积为-1),所以取绝对值判断即可覆盖这两种情况。
  • 阈值可以根据你的精度需求调整,比如1e-5或1e-7,避免因为计算误差导致误判。

内容的提问来源于stack exchange,提问作者iain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:32:35