如何确保特征等距保持等距?

时间:2017-09-12 12:34:37

标签: c++ math matrix eigen eigen3

我目前正在调查Eigen::Isometry3f,定义为 typedef Transform<float,3,Isometry> Isometry3f;

因此,我无法为Affine3f分配Isometry3f,这样可以保持等距不变。 (原因是,在Mode的赋值运算符中检查Transform

但我可以 - 通过Transform::operator(...)Transform::m_matrix(...)的快捷方式 - 执行

Eigen::Isometry3f iso;
iso.setIdentity();
iso(1, 1) = 2; //works (but should not ?!)

因而破坏等距。

Q1 : 不应该Transform::operator(...)被禁止或至少发出警告?如果你真的想搞砸了,你仍然可以使用Transform.matrix()(1,1) = 2 ......

Q2 : 还有其他陷阱我可能会意外破坏我的等轴测图吗?

Q3 : 如果还有其他陷阱:Mode==Isometry的意图是什么?是不是要确保封闭性/安全性?

1 个答案:

答案 0 :(得分:2)

Mode==Isometry的主要目的是提高某些操作的速度,如反转或旋转部分的提取。它基本上说“我,用户,保证Eigen的基础矩阵代表等距”。所以用户有责任不自拍。您还可以通过用坏矩阵替换线性部分来打破初始等距:

iso.linear() = Matrix3f::Random();

检查isometry并不便宜,因此在任何地方添加检查都会破坏最初的目的。也许,添加bool Transform::checkIsometry()有助于跟踪用户代码中的问题,但这超出了SO的范围。