首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >投影几何-利用本征在三维中寻找平面

投影几何-利用本征在三维中寻找平面
EN

Stack Overflow用户
提问于 2017-03-15 09:48:03
回答 1查看 1.1K关注 0票数 1

我试着用3D中的三点来构造一架飞机。我想用射影几何学来实现这一点。

据我所知,只要“简单地”解决以下问题,就可以找到一架飞机:

代码语言:javascript
复制
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。有人能给我指出正确的使用方法吗?

到目前为止,我有以下代码:

代码语言:javascript
复制
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()); 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-15 10:05:33

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

代码语言:javascript
复制
Vector4f Plane = A.jacobiSvd(ComputeFullU | ComputeFullV).solve(Vector3f::Zero());

Eidt,由于这个方程组不是完全定义的,它可能给出(0,0,0,0,0)的平凡解。通过将矩阵展开为4x4,求解(0,0,0,1)并将结果缩放为x(3),可以通过约束结果向量的长度来解决这个问题:

代码语言:javascript
复制
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)的解。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42806131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档