我对如何创建一个简单的转换矩阵感到困惑。
我有以下C++代码:
static constexpr float pos_scale = 2 * size / iside;
static constexpr std::array<float, 2> pos_translation = { -size, -size };
不幸的是,pos_translation
需要是std::array
,因为您无法生成Eigen::Vector2f
constexpr。
然后我有一个矢量:
Vector2i xy;
这将充满一些数据。我想将xy
转换为Vector2f
,方法是将其转换为齐次坐标,乘以变换矩阵,然后再次删除齐次坐标。
转换矩阵被声明为
Matrix3f xy_to_pos;
至少,我认为这是正确的类型?
我的问题是,如何从pos_scale
(必须首先应用:首先是缩放,然后是平移(和pos_translation
初始化xy_to_pos
?
一旦我有了xy_to_pos
,我将如何使用它将xy
转换为Vector2f pos
?
我试过各种各样的东西,比如
Matrix3f xy_to_pos = Matrix3f::Identity() * Eigen::Scaling(pos_scale) * Eigen::Translation2f(pos_translation[0], pos_translation[1]);
但是什么都不编译,编译错误也于事无补。当然,我也在谷歌上搜索过,但找不到一个有用的例子。
我发现了:
static constexpr float pos_scale = 2 * size / iside;
static constexpr std::array<float, 2> pos_translation = { -size, -size };
Transform<float, 2, Affine> const xy_to_pos =
Transform<float, 2, Affine>{Transform<float, 2, Affine>::Identity()}
.translate(Vector2f{pos_translation.data()})
.scale(pos_scale);
Vector2i xy(2, 3); // Or whatever
Vector2f pos = xy_to_pos * xy.cast<float>();