2012-03-13 17 views
9

は、私は2つの変圧器、平行移動と回転を持っている:ブーストジオメトリトランスを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); 

私はbg::transform二回するたびに呼び出し、中間変数を使用する必要がないように、私は、一つにそれらを結合するにはどうすればよいですか?

+0

私は完全にはわかりませんが、私はまだそれができないと思います。誰かが私が間違っていることを証明したい。 – owagh

答えて

7

translateとrotateの両方がアフィン変換です。つまり、行列を使用して表現できます。したがって、行列が2つの変換の行列の積と等しい新しい変圧器を作成するだけです。

#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()) ; ' –

関連する問題