2017-03-15 11 views
1

私は3Dで3つの点から平面を構築しようとしています。 これを達成するために射影ジオメトリを使用したいと思います。射影ジオメトリ - 固有値を使って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に設定したいと思います。 誰かが正しい方法を教えてくれますか?あなたに3行ベクトルを与える4行ベクトルを掛け

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の行列:

は、これまでのところ私は、次のコードを持っています。したがって、あなたはVector3f::Zero()のために解く必要があります。また、あなたは最後の行は次のようになりますフルUとVを計算するために必要な固定サイズの行列のために:この式のシステムが完全に定義されていないので

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

Eidt することは、それはあなたの自明な解を与えるかもしれませんof(0,0,0,0)のあなたは、4×4に行列を拡張することによって得られたベクトルの長さを拘束を解く(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)の望ましい解を与えます。

+0

ありがとうございます。コードがコンパイルされますが、次の行で停止します。 'eigen_assert(EIGEN_IMPLIES(m_computeThinU || m_computeThinV、MatrixType :: ColsAtCompileTime == Dynamic)&& 'JacobiSVD:薄いUとVは、 ")" JacobiSVD.h "内 – NewTech

+0

@NewTech私は自分の答えを更新しました。問題は 'ComputeThinU'と' ComputeThinV'は 'Matrix 'のような固定サイズの行列では利用できないということです。 – maddin45

+0

ああ。さて、コードは完全に動作します。しかし、(0,0,0,0)のtrival解を与えるだけです。私は(-1、-1、-1、1)を得ることを期待する。制約を設定する方法はありますか? – NewTech

関連する問題