2012-03-13 4 views
9

다음과 같이 내가 두 변압기, 번역 및 회전이 : 나는 두 번 할 때마다 bg::transform 전화 및 중간 변수를 사용하지 않도록 2 개의 부스트 기하학 변압기를 결합하는 방법은 무엇입니까?

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

은 어떻게 하나로 결합합니까?

+0

나는 완전히 확신 할 수는 없지만 아직 할 수 없다고 생각합니다. 누군가가 나를 틀리게 증명하기를 바랍니다. – owagh

답변

7

translate 및 rotate는 모두 affine 변환입니다. 즉, 행렬을 사용하여 표현할 수 있습니다. 따라서 행렬이 두 변환의 행렬의 곱과 동일한 새 변압기를 만드는 것뿐입니다.

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

는 곱셈의 행렬의 순서에 관한 매우주의 수 :

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

여기에 전체 작업 예이다. 위의 예는 먼저 번역 된 다음 회전합니다.

+0

'prod' 기능은 어디서 오는 걸까요? –

+0

나중에 참조 할 수 있도록 :'prod' 함수는'boost :: numeric :: Uublas' 네임 스페이스에 있습니다. 또한 부스트 1.64부터 시작하여 'trans :: ublas_transformer ...'로 시작하는 줄은 'trans :: matrix_transformer 이어야합니다. rotateTranslate (translate.matrix() * rotate.matrix()) ;' –

관련 문제