【问题标题】:How to combine two Boost Geometry transformers?如何组合两个 Boost Geometry 变压器?
【发布时间】:2012-03-30 07:02:46
【问题描述】:

我有两个转换器,一个平移和一个旋转如下:

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两次并使用中间变量?

【问题讨论】:

  • 我不完全确定,但我认为还不能完成。希望有人证明我错了。

标签: c++ boost boost-geometry


【解决方案1】:

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

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;
}

非常注意乘法中矩阵的顺序。上面的例子先平移,然后旋转。

【讨论】:

  • prod函数从何而来?
  • 供将来参考:prod 函数位于 boost::numeric::ublas 命名空间中。另外,从 Boost 1.64 开始,以trans::ublas_transformer... 开头的行应该是trans::matrix_transformer&lt;double, 2, 2&gt; rotateTranslate(translate.matrix() * rotate.matrix());
猜你喜欢
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多