Как совместить два трансформатора Boost Geometry? - PullRequest
9 голосов
/ 14 марта 2012

У меня есть два трансформатора, перевод и вращение следующим образом:

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 и использовать промежуточную переменную?

1 Ответ

7 голосов
/ 03 апреля 2012

Как translate, так и rotate являются аффинными преобразованиями, то есть они могут быть представлены с использованием матрицы. Поэтому все, что вам нужно сделать, это создать новый преобразователь, матрица которого равна произведению матриц двух преобразований.

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

Будьте очень внимательно относитесь к порядку матриц в умножении. В приведенном выше примере сначала выполняется перевод, а затем поворот.

...