我有一堆共面点定义了3D空间中的多边形。它们总是以相同的方式缠绕(例如顺时针方向)。我需要确定包含该多边形的平面的有符号法线,即知道该多边形的哪个方向是“向上”。
这看起来很容易:取两条边(顶点差异)并计算叉积。但如果边缘碰巧是共线的(你得到一个零幅度的交叉乘积),那就失败了。
然后我尝试走顶点列表,直到找到第二条边,与第一条边形成一个相当大的角度。这在凸多边形上可靠地工作,但如果我最终得到的两条边没有定义多边形内的三角形,它可能会失败(指向相反的方向)在非凸多边形上。
我知道如果我首先对多边形进行三角测量,那么我可以轻松可靠地检查任何三角形的面部......但问题是我的三角测量库需要知道平面正常。所以,鸡蛋必须在鸡肉之前来。
如何在非凸多边形中选取两条边(或三个顶点),以便可靠地定义多边形面向的方向?
如果我是你,我会用以下方式完成它:
请注意,在步骤2之后,您有一个具有正确方向和正确方向的矢量,其幅度为2 S,其中S是多边形的面积。这就是为什么它应该工作,除非你的多边形面积为零或几乎为零。
顺便说一下,这里使用的点C只是为了使位于远离原点的小多边形的计算更加精确。您可以选择C = 0,从计算中有效地将其删除。
sum of consecutive cross products provided by stgatilov不健壮。例如,请参阅Robust polygon normal calculation。
一个强大的解决方案是找到所有i,j,(i <j)的最大叉积(P [i] - C)x(P [j] - C)并对其进行归一化。它将对应于多边形的最大内接三角形。
计算三维多边形的三个signed areas,这三个多边形是将3D多边形投影到XY,YZ和ZX平面上,从而为您提供所需的法线。