如何有效地确定3D空间中多边形的法线?

时间:2015-08-28 15:03:21

标签: algorithm polygon computational-geometry geometry-surface

我有一堆共面点定义了3D空间中的多边形。它们总是以相同的方式缠绕(例如顺时针方向)。我需要确定包含这个多边形的平面的有符号法线,即知道哪条路是" up"对于那个多边形。

这首先看起来很容易:取两条边(顶点差异)并计算叉积。但如果边缘碰巧是共线的(你会得到一个零幅度的交叉积),那就失败了。

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

我知道如果我首先对多边形进行三角测量,那么我可以轻松可靠地检查任何三角形的面部......但问题是我的三角测量库需要知道平面正常。所以,鸡蛋必须在鸡肉之前来。

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

3 个答案:

答案 0 :(得分:3)

如果我是你,我会按照以下方式完成:

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

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

答案 1 :(得分:0)

sum of consecutive cross products不够健壮。例如,请参见Robust polygon normal calculation

一个可靠的解决方案是找到所有i,j,(i

答案 2 :(得分:-1)

计算三维多边形中的三个signed areas,这三个多边形是将3D多边形投影到XY,YZ和ZX平面上,从而为您提供所需的法线。