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