2012-03-13 15 views
9

Mam dwa transformatory, tłumaczenia i obrót, co następuje:Jak połączyć dwa transformatory 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); 

Jak mogę połączyć je w jedną całość, tak że nie mam zadzwonić bg::transform dwa razy i za każdym razem użyć zmiennej pośredniej?

+0

Nie jestem do końca pewien, ale nie sądzę, aby było to możliwe. Mam nadzieję, że ktoś mi udowodni, że się mylę. – owagh

Odpowiedz

7

Zarówno translate jak i rotate są transformacjami afinicznymi, tj. Mogą być reprezentowane za pomocą macierzy. Dlatego wszystko, co musisz zrobić, to stworzyć nowy transformator, którego macierz jest równa iloczynowi macierzy dwóch transformacji.

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

Oto pełny przykład roboczych:

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

Bądź bardzo ostrożny odnośnie rzędu macierzy w mnożenia. Powyższy przykład najpierw tłumaczy, a następnie obraca się.

+0

Skąd pochodzi funkcja 'prod'? –

+0

Do wykorzystania w przyszłości: funkcja 'prod' funkcjonuje w przestrzeni nazw' boost :: numeric :: ublas'. Ponadto, począwszy od Boost 1.64, wiersz zaczynający się od 'trans :: ublas_transformer ...' powinien być 'trans :: matrix_transformer rotateTranslate (translate.matrix() * rotate.matrix()) ; ' –