从 Eigen::Translation 构造 Eigen::Transform
Posted
技术标签:
【中文标题】从 Eigen::Translation 构造 Eigen::Transform【英文标题】:Construct Eigen::Transform from Eigen::Translation 【发布时间】:2014-06-16 14:17:13 【问题描述】:我有以下代码:
void mySetTransform(const Eigen::Affine3d& T);
...
mySetTransform(Eigen::Translation3d(1.0,2.0,3.0));
这不会编译,它无法将Eigen::Translation3d
转换为Eigen::Affine3d
。以下行导致相同的错误:
Eigen::Affine3d test = Eigen::Translation3d(r);
但这很好:
Eigen::Affine3d test;
test = Eigen::Translation3d(r);
所以,看起来=
运算符工作正常,但是没有定义使用Eigen::Translation3d
构建Eigen::Affine3d
的构造函数。
文档中有以下 note 用于 Translation
类:
这个类不是用来存储翻译的 转换,而是使构造和 Transform 对象的更新。
有什么方法可以声明上述函数,以便可以使用任何转换对象(如在 Eigen/Geomerty 中声明的Translation
)直接调用它(不使用临时变量)?
【问题讨论】:
【参考方案1】:这是因为 Transform from a Translation 的构造函数是显式的。所以你必须明确地调用它:
Translation3d t(1.0,2.0,3.0);
mySetTransform(Affine3f(t));
让我们考虑以下两个例子:
Affine3d test1(t); // OK
Affine3d test2 = t; // NOT OK
即使在这两种情况下都是调用的构造函数(不是 operator=),但对于显式构造函数,只有第一个是可以的。这是标准的 C++ 规则。当然你也可以这样做:
Affine3d test3 = Affine3d(t); // OK
【讨论】:
感谢您的回答。在我的问题开头调用该函数适用于mySetTransform(Eigen::Affine3d(Eigen::Translation3d(1.0,2.0,3.0)));
。将构造函数声明为 explicit
会使该示例中的代码可读性稍差。我认为有一个明确的 ctor 是有充分理由的;如果您能准确说明为什么它是明确的,我将不胜感激。
本质上是为了防止意外开销。以上是关于从 Eigen::Translation 构造 Eigen::Transform的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #614 (Div. 2)E(思维,构造,DP)
Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!)E(构造)