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

问题描述 投票:1回答:3

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

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

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

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

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

algorithm polygon computational-geometry geometry-surface
3个回答
4
投票

如果我是你,我会用以下方式完成它:

  1. 选择多边形附近的任何点C(任何顶点或质心)。
  2. 对所有i(包括最后和第一点对)求和交叉积(P [i] - C)x(P [i + 1] - C)。
  3. 归一化和向量。

请注意,在步骤2之后,您有一个具有正确方向和正确方向的矢量,其幅度为2 S,其中S是多边形的面积。这就是为什么它应该工作,除非你的多边形面积为零或几乎为零。

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


2
投票

sum of consecutive cross products provided by stgatilov不健壮。例如,请参阅Robust polygon normal calculation

一个强大的解决方案是找到所有i,j,(i <j)的最大叉积(P [i] - C)x(P [j] - C)并对其进行归一化。它将对应于多边形的最大内接三角形。


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.