Boost.Geometry for_each_point

for_each_point()は、図形に含まれる全ての点に対して操作を行うためのアルゴリズムです。
図形をmutableに操作したい場合などに、transformの代わりに使えるのではないかと思います。


以下は、三角形を平行移動する例:

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

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

struct move_point {
    template <class Point>
    void operator()(Point& p) const
    {
        bg::set<0>(p, bg::get<0>(p) + 3);
        bg::set<1>(p, bg::get<1>(p) + 3);
    }
};

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

    bg::for_each_point(poly, move_point());

    std::cout << bg::dsv(poly) << std::endl;
}
(((3, 3), (6, 6), (6, 3), (3, 3)))


参照:
for_each_point algorithm
for_each_point algorithm(constバージョン)