2017-03-15 79 views
1

我正試圖用三維中的三個點構建飛機。 我想用射影幾何來實現這一點。投影幾何 - 使用特徵在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()); 
+0

我會去一個非矩陣方法,請參閱https://en.wikipedia.org/wiki/Plane_(geometry)#Method_3。 – Shaana

+0

這個想法是使用投影幾何有簡單的方法來測試其他點是否屬於這個平面,只需計算'Plane.transpose()* otherPoint' – NewTech

回答

1

一個3×4矩陣乘以一個4行向量會給你一個3行向量。因此你必須解決一個Vector3f::Zero()。此外,對於固定大小的矩陣,你需要計算完整的U和V的最後一行是這樣的:

Vector4f Plane = A.jacobiSvd(ComputeFullU | ComputeFullV).solve(Vector3f::Zero()); 

Eidt 由於這一公式體系尚未完全確定,它可能給你的平凡解(0,0,0,0)。

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); 

這將:可以通過由X(3)的矩陣擴展到4×4,求解(0,0,0,1)和縮放結果約束所得矢量的長度解決給你所需的解決方案(-1,-1,-1,1)。

+0

謝謝。現在代碼可以編譯,但是會停在以下行: 'eigen_assert(EIGEN_IMPLIES(m_computeThinU || m_computeThinV,MatrixType :: ColsAtCompileTime == Dynamic)&& 「JacobiSVD:thin U和V只在矩陣的動態數字爲列「。)'裏面的」JacobiSVD.h「 – NewTech

+0

@NewTech我更新了我的答案。問題是'ComputeThinU'和'ComputeThinV'不適用於固定大小的矩陣,比如'Matrix '。 – maddin45

+0

啊。好的,現在代碼運行完美。但只給出(0,0,0,0)的trival解決方案。我期望得到(-1,-1,-1,1)。有沒有設置約束的方法? – NewTech