给定一般的平面三维多边形,是否有一种通用的方法来找到该平面多边形的标准正交基础?
最直接的方法是假设取多边形的前3个点,并分别形成两个向量,这些是我们正在寻找的两个标准正交基向量。但是这种方法的问题是这3个点可能在多边形的同一条线上排列,因此我们得到的只有一个,而不是得到两个正交向量。
找到第二个正交矢量的另一种方法是循环多边形并找到形成与第一个不同的正交矢量的另一个点,但是这种方法容易受到数值误差的影响(例如,如果第二个矢量几乎是与第一个向量相同?数值误差可能很大。)
还有其他更好的方法吗?
答案 0 :(得分:0)
您可以使用由任意两个顶点连接的任意两条线的叉积。如果交叉产品太低,那么你就处于堕落的领域。
您还可以获取质心(点的平均值,保证位于同一平面上),并选择从质心到任意顶点的矢量中任意两个交叉积的最大值。这将是最准确的正常情况。请注意,如果最大的交叉产品很小,您的正常情况可能不准确。
如果找不到任何不接近0的叉积,则原始多边形会退化,很难找到法线。在这种情况下,您可以使用任意精度或自适应精度代数,但是,当然,舍入误差在源数据中已经很重要,因此这可能没有帮助。如果可能,首先删除退化多边形,如果必须,再将网格缝合起来:)。
答案 1 :(得分:0)
这有点ott但是一种方法是计算点的协方差矩阵,然后对角线化。如果这些点确实是平面的,那么协方差矩阵的一个特征值将为零(或者说非常小,由于有限精度算术),并且相应的特征向量将是平面的法线;另外两个特征向量将跨越多边形的平面。 如果你有N个点,并且第k个点的第i个坐标是p [k,i],则可以通过
计算均值(向量)和(3×3)协方差矩阵m[i] = Sum{ k | p[k,i]}/N (i=1..3)
C[i,j] = Sum{ k | (p[k,i]-m[i])*(p[k,j]-m[j]) }/N (i,j=1..3)
请注意,C是对称的,因此要找到对角线化的方法,您可能需要查找“对称特征值问题”