Boost.Geometry 反時計回りのポリゴンを扱う

boost::geometry::model::polygonは、時計回りか否かを指定するClockWiseパラメータがあり、それをfalseにすることで、反時計回りのポリゴンとして操作できるようになります。


通常、ClockWiseパラメータがデフォルト値trueのままでポリゴンを反時計回りで扱おうとすると、アルゴリズムの多くが期待しない結果を返します。

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

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

    const double result = bg::area(poly); // 面積を求める

    std::cout << result << std::endl;
}
-4.5


ClockWiseをfalseに設定することで、反時計回りのポリゴンでもアルゴリズムがそれを考慮した結果を返してくれるようになります。

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

static const bool clock_wise = false;
typedef bg::model::polygon<point, clock_wise> reverse_polygon;

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

    const double result = bg::area(poly); // 面積を求める

    std::cout << result << std::endl;
}
4.5