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

Boost.Geometry envelope

C++

envelope()は、図形の包絡線を計算するアルゴリズムです。
第1引数として渡した図形の包絡線を、Box Conceptの型として第2引数で返します。

#include <iostream>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/box.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;
typedef bg::model::box<point> box;

int main()
{

    polygon poly;
    bg::exterior_ring(poly) = boost::assign::list_of<point>
        (2.0, 1.3)
        (2.4, 1.7)
        (3.6, 1.2)
        (4.6, 1.6)
        (4.1, 3.0)
        (5.3, 2.8)
        (5.4, 1.2)
        (4.9, 0.8)
        (3.6, 0.7)
        (2.0, 1.3)
        ;

    box bx;
    bg::envelope(poly, bx);
      
    std::cout
        << "poly: " << bg::dsv(poly) << std::endl
        << "bx: "   << bg::dsv(bx) << std::endl;
}
poly: (((2, 1.3), (2.4, 1.7), (3.6, 1.2), (4.6, 1.6), (4.1, 3), (5.3, 2.8), (5.4, 1.2), (4.9, 0.8), (3.6, 0.7), (2, 1.3)))
bx: ((2, 0.7), (5.4, 3))


点線部分が、envelope()で計算した包絡線です。


また、return_envelope()を使用すれば、計算結果を参照の引数ではなく戻り値で返してくれます。
return_envelope()には、Box Conceptの型を指定します。

#include <iostream>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/box.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;
typedef bg::model::box<point> box;

int main()
{

    polygon poly;
    bg::exterior_ring(poly) = boost::assign::list_of<point>
        (2.0, 1.3)
        (2.4, 1.7)
        (3.6, 1.2)
        (4.6, 1.6)
        (4.1, 3.0)
        (5.3, 2.8)
        (5.4, 1.2)
        (4.9, 0.8)
        (3.6, 0.7)
        (2.0, 1.3)
        ;

    const box bx = bg::return_envelope<box>(poly);

    std::cout
        << "poly: " << bg::dsv(poly) << std::endl
        << "bx: "   << bg::dsv(bx) << std::endl;
}
poly: (((2, 1.3), (2.4, 1.7), (3.6, 1.2), (4.6, 1.6), (4.1, 3), (5.3, 2.8), (5.4, 1.2), (4.9, 0.8), (3.6, 0.7), (2, 1.3)))
bx: ((2, 0.7), (5.4, 3))


参照:

envelope algorithm
return_envelope algorithm