我有一组point3D(X,Y,Z)。我需要检查它们是否与某种公差共面。我的操作方式是:将所有坐标从全局坐标系转换为局部坐标系,其中局部x,y位于集合中3个点定义的平面的同一平面上,而z垂直于该平面。然后,我要做的就是检查集合中的所有点是否都具有近似相似的局部z值。
但是,棘手的部分是如何选择3个点来定义参考平面。如果随机选取,这将导致有时这组点是共面的,有时不是共面的。你有什么建议吗?
答案 0 :(得分:3)
最常见的方法可能是主成分分析:https://en.wikipedia.org/wiki/Principal_component_analysis
简短描述是:
答案 1 :(得分:0)
普通if
从数据集中选择任何不在单行上的3个点,将它们称为n
。为了提高准确性,它们之间应该更远。现在要构建法线向量,请执行以下操作:
p0,p1,p2
检查所有点
对于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个点呢?
选择1e-10
选择p0,p1
作为具有最小p0
坐标的点和x,y,z
具有最大p1
坐标的点。这样可以确保它们足够远。
选择x,y,z
现在灼烧点并找到p2
最小的点。虽然|dot( p1-p0, pi-p0 )|
不为零且足够大(例如,至少|pi-p0|
)。这样可以确保这些点形成三角形,并且彼此之间的距离不太近。
所有这些操作都可以在0.1*|p1-p0|
中完成,因此仍然很快...