読者です 読者をやめる 読者になる 読者になる

Boost.Geometry transform

C++

transform()は、strategyに基づいて図形に変換をかける関数です。
図形の平行移動や回転などを行うことができます。内部ではBoost.uBLASの行列を使用しています。


まず、平行移動。
translate_transformer strategyには、移動先の座標ではなく、移動量を指定します。

#include <iostream>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/assign/list_of.hpp>

namespace bg = boost::geometry;
namespace trans = bg::strategy::transform;

typedef bg::model::d2::point_xy<double> point;
typedef bg::model::polygon<point> polygon;

int main()
{
    polygon poly;
    bg::exterior_ring(poly) = boost::assign::list_of<point>
        (0, 0)
        (3, 3)
        (3, 0)
        (0, 0)
        ;

    trans::translate_transformer<point, point> translate(1.5, 1.5);

    polygon result;
    bg::transform(poly, result, translate);

    std::cout << bg::dsv(result) << std::endl;
}
(((1.5, 1.5), (4.5, 4.5), (4.5, 1.5), (1.5, 1.5)))

自身を書き換えることはできないようなので、そういった操作が必要な場合はfor_each_point()を使用することになります。


次に拡大縮小。
scale_transformerには、拡大率を指定します。

#include <iostream>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/assign/list_of.hpp>

namespace bg = boost::geometry;
namespace trans = bg::strategy::transform;

typedef bg::model::d2::point_xy<double> point;
typedef bg::model::polygon<point> polygon;

int main()
{
    polygon poly;
    bg::exterior_ring(poly) = boost::assign::list_of<point>
        (0, 0)
        (3, 3)
        (3, 0)
        (0, 0)
        ;

    trans::scale_transformer<point, point> translate(3);

    polygon result;
    bg::transform(poly, result, translate);

    std::cout << bg::dsv(result) << std::endl;
}
(((0, 0), (9, 9), (9, 0), (0, 0)))


次に回転。
rotate_transformerには、角度の単位がデグリなのかラジアンなのかをboost::geometry::degree or boost::geometry::radianで指定した上で角度を渡します。
回転は、原点(0, 0)を中心に時計回りで行われます。

#include <iostream>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/assign/list_of.hpp>

namespace bg = boost::geometry;
namespace trans = bg::strategy::transform;

typedef bg::model::d2::point_xy<double> point;
typedef bg::model::polygon<point> polygon;

int main()
{
    polygon poly;
    bg::exterior_ring(poly) = boost::assign::list_of<point>
        (0, 0)
        (3, 3)
        (3, 0)
        (0, 0)
        ;

    trans::rotate_transformer<point, point, bg::degree> translate(90.0);

    polygon result;
    bg::transform(poly, result, translate);

    std::cout << bg::dsv(result) << std::endl;
}
(((0, 0), (3, -3), (1.83691e-016, -3), (0, 0)))

緑が回転前の図形。
オレンジが回転後の図形です。



参照:
transform algorithm(with strategy)
transform algorithm
degree type
radian type