2017-03-15 8 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

× 4 매트릭스 :

지금까지 나는 다음과 같은 코드가 있습니다. 따라서 Vector3f::Zero()을 풀어야합니다. 이 방정식의 시스템이 완전히 정의되지 않기 때문에

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

이 Eidt가 , 그것은 당신에게 사소한 해결책을 줄 수 있습니다 또한, 고정 된 크기의 행렬을 위해 당신은 전체 U와 V. 마지막 행은 다음과 같습니다 계산해야 of (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 : 얇은 U 및 V는 행렬에 동적 수 열. ")'"JacobiSVD.h " – NewTech

+0

@NewTech 내 답변을 업데이트했습니다. 문제는'ComputeThinU'와'ComputeThinV'는'Matrix '와 같은 고정 크기 행렬에 사용할 수 없다는 것입니다. – maddin45

+0

아. 이제 코드가 완벽하게 실행됩니다. 그러나 오직 (0, 0, 0, 0)의 trival 솔루션을 제공합니다. 나는 (-1, -1, -1, 1)을 얻을 것으로 기대한다. 제한을 설정하는 몇 가지 방법이 있습니까? – NewTech