如何组合两个Boost几何变换器?

Nes*_*tor 9 c++ boost boost-geometry

我有两个变形金刚,翻译和轮换如下:

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);
Run Code Online (Sandbox Code Playgroud)

如何将它们合并为一个,这样我bg::transform每次都不必调用两次并使用中间变量?

use*_*136 7

平移和旋转都是仿射变换,即,它们可以使用矩阵来表示.因此,您所要做的就是创建一个新的变换器,其矩阵等于两个变换矩阵的乘积.

trans::ublas_transformer<point, point, 2, 2> translateRotate(prod(rotate.matrix(), translate.matrix()));
Run Code Online (Sandbox Code Playgroud)

这是一个完整的工作示例:

#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;
}
Run Code Online (Sandbox Code Playgroud)

关于乘法中矩阵的顺序要非常小心.上面的例子首先翻译,然后旋转.

  • 供将来参考:`prod` 函数位于 `boost::numeric::ublas` 命名空间中。此外,从 Boost 1.64 开始,以 `trans::ublas_transformer...` 开头的行应该是 `trans::matrix_transformer&lt;double, 2, 2&gt; rotateTranslate(translate.matrix() * rotate.matrix());` (2认同)