从 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 1037E-Trips 构造

Codeforces Round #614 (Div. 2)E(思维,构造,DP)

Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!)E(构造)

从包含不同长度子列表的列表中构造所有组合

HDU3572构造图的模型

注册后(即从控制台)如何执行 Angular 控制器的构造函数?