c++ - 如何组合两个 Boost Geometry 变压器?

标签 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);

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

最佳答案

平移和旋转都是仿射变换,即可以用矩阵表示。因此,您所要做的就是创建一个新的更改器(mutator),其矩阵等于两个变换的矩阵的乘积。

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

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

关于c++ - 如何组合两个 Boost Geometry 变压器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9691482/

相关文章:

c++ - 获取找到给定选项的 INI 文件行号的跨平台方法

c++ - 为什么 qi::skip 会因来自词法分析器的标记而失败?

c++ - boost::geometry::union_ 产生自相交

c++ - Intersection_inserter 未在此范围内声明

c++ - 将 makefile 与 boost 线程一起使用时遇到问题

c++ - 在没有全局变量的解耦函数\方法之间共享数据

进行文件操作时,C++ 程序在 Windows 和 Linux 上运行速度慢得多?

C++ 根据两个标准对对进行排序

c++ - 在 Visual Studio C++ 2008 Express 中使用 Boost Asio 构建应用程序时出现链接器错误

c++ - 点和序列的 boost::geometry::within() 行为