c++ - 如何确保特征等距保持等距?

标签 c++ math matrix eigen eigen3

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

例如,我无法分配 Affine3f到那个Isometry3f ,这有利于保持等轴测完整。 (原因是 ModeTransform 的赋值运算符中被检查。)

但是我可以 - 通过 Transform::operator(...) ,它是 Transform::m_matrix(...) 的快捷方式- 做

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

从而破坏等轴测图。

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

第二季度: 是否还有其他陷阱可能导致我不小心破坏我的等轴测图?

第三季度: 如果还有其他陷阱: Mode==Isometry 的意图是什么? ?不就是为了保证封闭性/安全性吗?

最佳答案

Mode==Isometry的主要目的是提高一些操作的速度,例如反转或提取旋转部分。它本质上是说“我,用户,向 Eigen 保证底层矩阵代表等距”。因此,请勿自行拍摄,责任由用户承担。您还可以通过用坏矩阵替换线性部分来破坏初始等距:

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

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

关于c++ - 如何确保特征等距保持等距?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46176533/

相关文章:

math - 如何使用按位运算符使 ARGB 透明

C++ Binary >> 没有找到采用右手操作数类型的 const char 错误的运算符

c++ - 通过引用传递避免对象切片

algorithm - 找到与一组 N 条线的距离最小的点

math - 使用 d3 检查三角形高度的逻辑

c - 尝试为任意大小的矩阵编写矩阵乘法器

r - 使用 R 中矩阵中不同行的值填充矩阵中的缺失值

linux - 在 shell 脚本中读取矩阵中的值

c++ - C++切换以按住鼠标左键吗?

c++ - 大多数派生类的析构函数中的纯虚拟调用