我有两个变形金刚,翻译和轮换如下:
namespace bg = boost::geometry;
namespace trans = bg::strategy::transform;
trans::translate_transformer<point, point> translate(px, py);
trans::rotate_transformer<point, point, bg::radian> rotate(rz);
如何将它们合并为一个,这样我就不必每次都调用bg::transform
两次并使用中间变量?
答案 0 :(得分:7)
平移和旋转都是仿射变换,即它们可以使用矩阵表示。因此,您所要做的就是创建一个新的变换器,其矩阵等于两个变换矩阵的乘积。
trans::ublas_transformer<point, point, 2, 2> translateRotate(prod(rotate.matrix(), translate.matrix()));
以下是一个完整的工作示例:
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/strategies/transform/matrix_transformers.hpp>
namespace bg = boost::geometry;
namespace trans = bg::strategy::transform;
typedef bg::model::d2::point_xy<double> point;
int main()
{
trans::translate_transformer<point, point> translate(0, 1);
trans::rotate_transformer<point, point, bg::degree> rotate(90);
trans::ublas_transformer<point, point, 2, 2> translateRotate(prod(rotate.matrix(), translate.matrix()));
point p;
translateRotate.apply(point(0, 0), p);
std::cout << bg::get<0>(p) << " " << bg::get<1>(p) << std::endl;
}
非常小心关于乘法中矩阵的顺序。上面的例子首先翻译,然后旋转。