给定N个平面方程,如何找到最接近它们的一个平面的方程



我得到了ax+by+cz+d=0形式的N平面方程,这意味着我们有它们的法线(a, b, c)和离原点的距离(d)。一般来说,平面是相似的,所以系数差别不大。我在给定的平面上没有任何点,但我想它们可以被采样。

我需要找到一个最接近它们的平面方程,即以最佳方式表示平面簇。换句话说,我需要将所有平面合并为一个

我试着取所有平面系数的平均值,这会产生一个很好的法线结果,但最后一个系数(d)似乎是错误的,得到的平面与簇的偏移很小。

这是对平面方程求平均值的代码。它使用特征库:

Eigen::Vector4d merged_plane(0,0,0,0);    
// planes are normalized
for (size_t i = 0; i < planes.rows(); ++i) {
merged_plane += planes(i);
}
merged_plane /= planes.rows();
// Normalize
merged_plane /= merged_plane.head<3>().norm();

您可以通过考虑一个更简单但相关的问题来找到问题的根源,即找到平面上两条线的平均值,例如xy平面上的线x=1和y=1。1x+0y和0x+1y的平均值是1/2 x+1/2 y,换句话说,斜率为-1的线。

我们有"平均值"的斜率。现在我们需要找到它与原点的距离。你的方案中的距离是两条给定直线的距离的平均值,即1和1,因此平均值为1。该线将与单位圆相切,因此将以斜率-1穿过(1/\sqrt{2},1/\sqr{2})。另一方面,我相信你希望你的线穿过"聚类中心",在这种情况下,这将是两条给定线的交点,即点(1,1)。通过(1/\sqrt{2},1/\sqr{2})的斜率-1的线与通过(1,1)的斜率-1的线之间的差异就是您注意到的偏移量。

我一时想不出办法来解决你的问题。你可以尝试的一种方法是重复随机选择三个平面,并找到它们的交点。然后求出这些交点的平均值。

我希望我能想出一个更优雅的答案,但我现在做不到。

最新更新