我正在尝试在3D中构造三个点的平面。我想使用投射几何形状来实现这一目标。
据我所知,可以"简单地"求解以下以找到飞机:
A * x = 0 ,where
A is a 3x4 Matrix - each row being one of the points (x,y,z,1)
x is the plane I want to find
我知道我需要有一个约束。因此,我想设置x(3) = 1
。有人可以请我指出正确使用的方法吗?
到目前为止,我有以下代码:
Eigen::Vector4f p1(0,0,1,1);
Eigen::Vector4f p2(1,0,0,1);
Eigen::Vector4f p3(0,1,0,1);
Eigen::Matrix<float,3,4> A;
A << p1.transpose(), p2.transpose(), p3.transpose();
// Throws compile error
// Eigen::Vector4f Plane = A.jacobiSvd(ComputeThinU | ComputeThinV).solve(Vector4f::Zero());
//throws runtime error (row-number do not match)
// Eigen::Vector4f Plane = A.fullPivHouseholderQr().solce(Eigen::Vector4f::Zero());
乘以4行向量乘以3x4矩阵将为您提供3行向量。因此,您必须解决Vector3f::Zero()
。另外,对于固定尺寸矩阵,您需要计算完整的U和V。最终线看起来像:
Vector4f Plane = A.jacobiSvd(ComputeFullU | ComputeFullV).solve(Vector3f::Zero());
eidt 由于该方程式系统未完全定义,因此它可能会给您(0,0,0,0)的微不足道解决方案。您可以通过将矩阵扩展到4x4,求解(0,0,0,1)并通过x(3):
将结果缩放来解决所得矢量的长度来解决所得的矢量长度。Eigen::Vector4f p1(0,0,1,1);
Eigen::Vector4f p2(1,0,0,1);
Eigen::Vector4f p3(0,1,0,1);
Eigen::Vector4f p4(1,1,1,1);
Eigen::Matrix<float,4,4> A;
A << p1.transpose(), p2.transpose(), p3.transpose(), p4.transpose();
// Throws compile error
Eigen::Vector4f Plane = A.jacobiSvd(Eigen::ComputeFullU | Eigen::ComputeFullV).solve(Vector4f::Unit(3));
Plane /= Plane(3);
这将为您提供(-1,-1,-1、1)的所需解决方案。