C++ 射影几何学-使用特征线在三维中查找平面

C++ 射影几何学-使用特征线在三维中查找平面,c++,3d,eigen,projective-geometry,C++,3d,Eigen,Projective Geometry,我正试图用三维中的三个点构造一个平面。 我想用射影几何来实现这一点 据我所知,人们可以“简单地”解决以下问题来找到一个平面: 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,

我正试图用三维中的三个点构造一个平面。 我想用射影几何来实现这一点

据我所知,人们可以“简单地”解决以下问题来找到一个平面:

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()); 
Eigen::vector4fp1(0,0,1,1);
本征::向量4f p2(1,0,0,1);
本征::向量4f p3(0,1,0,1);
特征矩阵A;

3x4矩阵乘以4行向量将得到3行向量。因此,您必须求解
向量3f::Zero()
。此外,对于固定大小的矩阵,您需要计算完整的U和V。最后一行如下所示:

Vector4f Plane = A.jacobiSvd(ComputeFullU | ComputeFullV).solve(Vector3f::Zero());
Eidt 由于这个方程组没有完全定义,它可能会给出(0,0,0,0)的平凡解。通过将矩阵扩展为4x4,求解(0,0,1)并按x(3)缩放结果,可以约束结果向量的长度,从而解决该问题:

Eigen::vector4fp1(0,0,1,1);
本征::向量4f p2(1,0,0,1);
本征::向量4f p3(0,1,0,1);
本征::向量4f p4(1,1,1,1);
特征矩阵A;

A谢谢。现在代码进行编译,但停在下面一行:
eigen_断言(eigen_暗示(m_computetinu | | m_computetinv,MatrixType::colsatciletime==Dynamic)&&“JacobiSVD:thin U和V仅在矩阵具有动态列数时可用。”)
在“JacobiSVD.h”中@NewTech我更新了我的答案。问题是
computetinu
computetinv
不适用于固定大小的矩阵,如
Matrix
。啊。好了,现在代码运行得很好。但只给出(0,0,0,0)的平凡解。我希望得到(-1,-1,-1,1)。有什么方法可以设置约束吗?@NewTech通过使用非零值的第四个矩阵行和向量中的第四个条目,将向量的长度约束为非零。我会选择非矩阵方法,请参阅。其思想是使用投影几何,通过简单计算
plane.transpose()*otherPoint
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);