2012-03-13 17 views
9

Tengo dos transformadores, una traslación y una rotación de la siguiente manera:¿Cómo combinar dos transformadores 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); 

¿Cómo combinarlos en una sola, por lo que no tengo que llamar dos veces cada vez bg::transform y utilizar una variable intermedia?

+0

No estoy del todo seguro, pero no creo que se pueda hacer todavía. Espero que alguien me demuestre que estoy equivocado. – owagh

Respuesta

7

Tanto la traducción como la rotación son transformaciones afines, es decir, se pueden representar utilizando una matriz. Por lo tanto, todo lo que tienes que hacer es crear un nuevo transformador cuya matriz sea igual al producto de las matrices de las dos transformadas.

trans::ublas_transformer<point, point, 2, 2> translateRotate(prod(rotate.matrix(), translate.matrix())); 

Aquí es un ejemplo de trabajo completo:

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

muy cuidado con respecto a la orden de las matrices en la multiplicación. El ejemplo anterior primero se traduce y luego gira.

+0

¿de dónde viene la función 'prod'? –

+0

Para referencia futura: la función 'prod' vive en el espacio de nombres' boost :: numeric :: ublas'. Además, comenzando con Boost 1.64, la línea que comienza con 'trans :: ublas_transformer ...' debe ser 'trans :: matrix_transformer rotateTranslate (translate.matrix() * rotate.matrix()) ; ' –