Algorithm 如何确定一组point3D是否在同一平面内?

Algorithm 如何确定一组point3D是否在同一平面内?,algorithm,geometry,point,plane,geometry-surface,Algorithm,Geometry,Point,Plane,Geometry Surface,我有一组点3D(X,Y,Z)。我需要检查它们是否共面,并带有某种公差。我的方法是:我将所有点从全局坐标系转换为局部坐标系,其中局部x,y位于由集合中3个点定义的平面的同一平面上,z垂直于该平面。然后,我需要做的就是检查集合中的所有点是否具有近似相似的局部z值 然而,棘手的部分是如何选取3个点来定义参照平面。如果随机拾取,这将导致点集有时共面,有时不共面。你有什么建议吗?最常用的方法可能是主成分分析: 简要说明如下: 计算输入点的3x3协方差矩阵 提取最小特征向量。这是平面的法向量,它是所有点的最

我有一组点3D(X,Y,Z)。我需要检查它们是否共面,并带有某种公差。我的方法是:我将所有点从全局坐标系转换为局部坐标系,其中局部x,y位于由集合中3个点定义的平面的同一平面上,z垂直于该平面。然后,我需要做的就是检查集合中的所有点是否具有近似相似的局部z值


然而,棘手的部分是如何选取3个点来定义参照平面。如果随机拾取,这将导致点集有时共面,有时不共面。你有什么建议吗?

最常用的方法可能是主成分分析:

简要说明如下:

  • 计算输入点的3x3协方差矩阵
  • 提取最小特征向量。这是平面的法向量,它是所有点的最小平方误差
  • 正常
    n

    从数据集中选择不在一行上的任意3个点,让我们调用它们
    p0、p1、p2
    。为了提高精度,它们之间应该更为遥远。现在要构造法向量,请执行以下操作:

    n = cross( p1-p0 , p2-p0 ); // perpendicular vector to both operands of cross
    n /= |n|;                   // unit vector
    
  • 检查所有点

    对于由
    p0、p1、p2
    形成的平面上的任何点,
    高度
    分量(在正常方向)应为零,因此对于任何点
    p

    |dot( p-p0 , n )|<=1e-10
    

    | dot(p-p0,n)|这与我在问题中描述的不一样吗?这里的问题实际上是使用什么标准来选择p1、p2和p3。这是相当棘手的,因为,例如,如果所有点都是共面的,但是p3,那么选择将导致错误的结果。@N.T.C是的,你是对的,对不起,我忘了提交答案的其他部分。。。愚蠢的我:)