11

次のように、変換と回転の 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毎回2回呼び出して中間変数を使用する必要がないように、それらを1つに結合するにはどうすればよいですか?

4

1 に答える 1

8

平行移動と回転はどちらもアフィン変換です。つまり、行列を使用して表すことができます。したがって、行列が 2 つの変換の行列の積に等しい新しい変換器を作成するだけで済みます。

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

完全な動作例を次に示します。

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

乗算における行列の順序については十分に注意してください。上記の例では、最初に平行移動してから回転します。

于 2012-04-03T12:40:45.117 に答える