Algorithm 如何有效地确定三维空间中多边形的法线?

Algorithm 如何有效地确定三维空间中多边形的法线?,algorithm,polygon,computational-geometry,geometry-surface,Algorithm,Polygon,Computational Geometry,Geometry Surface,我有一堆共面点定义了三维空间中的多边形。它们总是以相同的方式缠绕(例如顺时针)。我需要确定包含该多边形的平面的有符号法线,即,知道该多边形的“向上”方向 一开始这似乎很简单:取两条边(顶点差)并计算叉积。但如果边恰好是共线的(得到的是零级叉积),则该方法将失败 然后我试着遍历顶点列表,直到找到第二条边,它与第一条边形成一个相当大的角度。这在凸多边形上工作可靠,但在非凸多边形上可能会失败(指向相反的方向),如果我最后使用的两条边没有定义多边形内部的三角形 我知道如果我先对多边形进行三角剖分,那么我

我有一堆共面点定义了三维空间中的多边形。它们总是以相同的方式缠绕(例如顺时针)。我需要确定包含该多边形的平面的有符号法线,即,知道该多边形的“向上”方向

一开始这似乎很简单:取两条边(顶点差)并计算叉积。但如果边恰好是共线的(得到的是零级叉积),则该方法将失败

然后我试着遍历顶点列表,直到找到第二条边,它与第一条边形成一个相当大的角度。这在凸多边形上工作可靠,但在非凸多边形上可能会失败(指向相反的方向),如果我最后使用的两条边没有定义多边形内部的三角形

我知道如果我先对多边形进行三角剖分,那么我可以轻松可靠地检查任何三角形的面。。。但问题是我的三角测量库需要知道平面法线。所以,鸡蛋必须先于鸡


如何在非凸多边形中拾取两条边(或三个顶点),以可靠地定义多边形朝向哪个方向?

如果我是你,我会按以下方式进行操作:

  • 选择多边形附近的任意点C(任意顶点或质心)
  • 所有i(包括最后一个和第一个点对)的和叉积(P[i]-C)x(P[i+1]-C)
  • 规范化和向量
  • 请注意,在步骤2之后,有一个向量具有正确方向的法线方向,其大小为2s,其中S是多边形的面积。这就是为什么它应该工作,除非你的多边形有零或几乎零面积

    顺便说一下,这里使用点C只是为了使距离原点较远的小多边形的计算更加精确。您可以选择C=0,有效地将其从计算中删除。

    计算三维多边形投影到XY、YZ和ZX平面上产生的三个多边形中的三个,从而获得所需的法线。

    不稳定。例如,见


    一个稳健的解决方案是找到所有i,j,(iOfftopic。这不是一个编程问题。这更像是几何/数学。试着在这里提问,因为数学家经常给出一个不容易实现(或不清楚如何实现)的答案,例如,“如果连接相邻点的直线完全位于多边形内,则顶点就是耳朵”。。。一个真实的语句,但对实际编码没有帮助。我要的是一个我可以编写的算法。@JoeStrout我知道你已经有了一个满意的答案,所以我只是想提请你注意,我添加了一个不同的(更简单?)方法,我不确定你是否会“来寻找”另一个答案。经过测试并确认有效(至少在我所有的测试案例中)。非常感谢@YvesDaoust:我敢肯定你把问题看得很透彻。您的解决方案无法生成法线的正确方向。此外,它可能是不稳定的(取决于实现)。在异常/病理情况下,多边形面积比其直径小(有大洞的多边形、交叉多边形),可以通过使用凸包(通过Melkman算法获得)而不是原始多边形来改善情况。在大多数情况下,这将是过分的。这难道不能最终指向凹多边形的错误方向吗?C的选择是什么?