如何找出一组point3D是否在同一平面上?

时间:2019-01-02 22:29:11

标签: algorithm geometry point plane geometry-surface

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

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

2 个答案:

答案 0 :(得分:3)

最常见的方法可能是主成分分析:https://en.wikipedia.org/wiki/Principal_component_analysis

简短描述是:

  1. 计算输入点的3x3协方差矩阵
  2. 提取最小的特征向量。那是飞机的法线向量,对您所有的点都是最小二乘误差。

答案 1 :(得分:0)

  1. 普通if

    从数据集中选择任何不在单行上的3个点,将它们称为n。为了提高准确性,它们之间应该更远。现在要构建法线向量,请执行以下操作:

    p0,p1,p2
  2. 检查所有点

    对于n = cross( p1-p0 , p2-p0 ); // perpendicular vector to both operands of cross n /= |n|; // unit vector 组成的平面上的任何点,p0,p1,p2(沿法线方向)应为零,因此对于任何点altitude

    p

    由于FPU的精度损失,|dot( p-p0 , n )|<=1e-10 只是一些零阈值...任何不满足条件的点都不属于平面...

那么如何挑选形成三角形的3个点呢?

  1. 选择1e-10

    选择p0,p1作为具有最小p0坐标的点和x,y,z具有最大p1坐标的点。这样可以确保它们足够远。

  2. 选择x,y,z

    现在灼烧点并找到p2最小的点。虽然|dot( p1-p0, pi-p0 )|不为零且足够大(例如,至少|pi-p0|)。这样可以确保这些点形成三角形,并且彼此之间的距离不太近。

所有这些操作都可以在0.1*|p1-p0|中完成,因此仍然很快...