2012-03-13 13 views
9

Ho due trasformatori, una traduzione e una rotazione come segue:Come combinare due trasformatori 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); 

Come faccio a combinarle in una sola, in modo che non devo chiamare bg::transform due volte ogni volta e utilizzare una variabile intermedia?

+0

io non sono del tutto sicuro, ma non credo che possa essere ancora finito. Spero che qualcuno mi smentisca. – owagh

risposta

7

Sia tradurre e ruotare sono trasformazioni affini, cioè, possono essere rappresentati utilizzando una matrice. Pertanto, tutto ciò che devi fare è creare un nuovo trasformatore la cui matrice sia uguale al prodotto delle matrici delle due trasformate.

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

Ecco un esempio di lavoro 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; 
} 

essere molto attenti per quanto riguarda l'ordine delle matrici nella moltiplicazione. L'esempio sopra prima traduce, quindi ruota.

+0

da dove proviene la funzione 'prod'? –

+0

Per riferimento futuro: la funzione 'prod' risiede nello spazio dei nomi' boost :: numeric :: ublas'. Inoltre, a partire da Boost 1.64, la riga che inizia con 'trans :: ublas_transformer ...' 'dovrebbe essere trans :: matrix_transformer rotateTranslate (translate.matrix() * rotate.matrix()) ; ' –