Geometry 查找平面三维(可能退化)多边形的正交基

Geometry 查找平面三维(可能退化)多边形的正交基,geometry,computational-geometry,Geometry,Computational Geometry,给定一个普通的平面3D多边形,有没有找到该平面多边形的正交基的通用方法 最直接的方法是假设取多边形的前3个点,每个点形成两个向量,这是我们正在寻找的两个正交基向量。但这种方法的问题是,这三个点可能在多边形的同一条线上,因此我们只得到一个正交向量,而不是得到两个正交向量 找到第二个正交向量的另一种方法是在多边形中循环,并找到形成与第一个正交向量不同的正交向量的另一点,但这种方法容易受到数值误差的影响,例如,如果第二个向量与第一个向量几乎相同,该怎么办?数值误差可能很大 还有其他更好的方法吗 可以使

给定一个普通的平面3D多边形,有没有找到该平面多边形的正交基的通用方法

最直接的方法是假设取多边形的前3个点,每个点形成两个向量,这是我们正在寻找的两个正交基向量。但这种方法的问题是,这三个点可能在多边形的同一条线上,因此我们只得到一个正交向量,而不是得到两个正交向量

找到第二个正交向量的另一种方法是在多边形中循环,并找到形成与第一个正交向量不同的正交向量的另一点,但这种方法容易受到数值误差的影响,例如,如果第二个向量与第一个向量几乎相同,该怎么办?数值误差可能很大


还有其他更好的方法吗

可以使用由任意两个顶点连接的任意两条直线的叉积。如果叉积太低,那么你处于退化区域

您还可以将质心作为点的平均值,保证位于同一平面上,并拾取从质心到任何顶点的向量的任意两个叉积中的最大值。这将是最准确的正常值。请注意,如果最大叉积很小,则可能有不准确的正态分布


如果找不到任何不接近0的叉积,则原始多边形是退化的,很难找到法线。在这种情况下,您可以使用任意精度或自适应精度代数,但是,当然,舍入误差在源数据中已经很明显,因此这可能没有帮助。如果可能,首先移除退化多边形,如果必须,将网格重新缝合:。

这有点过分,但一种方法是计算点的协方差矩阵,然后将其对角化。如果这些点确实是平面的,那么协方差矩阵的一个特征值将为零或非常小,这是由于有限精度的算术运算,并且相应的特征向量将是平面的法线;其他两个特征向量将跨越多边形的平面。 如果有N个点,且第k个点的第i个坐标为p[k,i],则平均向量和3x3协方差矩阵可通过以下公式计算:

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是对称的,因此要找到如何对角化它,您可能需要查找对称特征值问题

您也可以取质心-我认为这就是这里的问题:如果不知道正交基,就无法在2D中投影多边形,因此没有办法找到质心,你不需要在2D上投射任何东西。只需对点求平均值,即可找到三维质心。pt->x=0;pt->y=0;pt->z=0;对于n=0;nx+=p[n]>x;pt->y+=p[n]->y;pt->z+=p[n]->z;}pt->x/=npoints;pt->y/=npoints;pt->z/=npoints;现在pt是3D中的质心。您可以使用正交最佳平面拟合算法来计算平面。然而,实现可能是一件痛苦的事情。试试看。但是,请注意,内部实现也可能存在不准确的情况,因此它可能无法解决您的问题。如果你的点是共线的,而你没有检查,世界上没有任何算法可以计算出你的平面的法线,因为它不是平面,它是一条线……你能更具体一点吗?什么是k和p?k只是一个循环计数器;例如,Sum{k | p[k,i]}我指的是p[1,i]+p[1,i]+..+p[N,i]即点的第i个坐标之和。正如我在回答中指出的,p[k,i]是定义多边形的第k个点的第i个分量。