#include <cstdio>
#include <vector>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/register/point.hpp>
#include <boost/geometry/geometries/register/ring.hpp>
#include <boost/geometry/io/wkt/wkt.hpp>
#include <boost/geometry/multi/geometries/multi_polygon.hpp>
#include <iostream>
typedef boost::geometry::model::d2::point_xy<double> pt;
typedef boost::geometry::model::polygon<pt> polygon;
typedef boost::geometry::model::multi_polygon<polygon> multi_polygon;

using namespace std;

int main()
{

    cout << "Boost version: " << BOOST_LIB_VERSION << endl;
    polygon red, green, blue;
    multi_polygon output;

    boost::geometry::read_wkt(
        "POLYGON((443.822 374.921,"
        " 344.128 204.477 ,"
        " 301.197 212.282 ,"
        " 274.723 241.573 ,"
        " 265.825 265.299 ,"
    	"1308 4746.67,"
        "443.822 374.921,"
        " ))", red);
    boost::geometry::read_wkt(
        "POLYGON(( 429.245 350 ,"
        " 344.128 204.477 ,"
        " 301.197 212.282 ,"
        " 274.723 241.573 ,"
        " 265.825 265.299 ,"
    	" 273.895 300,"
    	" 400 300 ,"
    	" 400 350 ,"
        " 429.245 350,"
        " ))", green);

    boost::geometry::read_wkt(
        "POLYGON(( 400 0,"
        " -400 0 ,"
        " -400 300 ,"
        "  400 300,"
        "  400 350,"
        "  600 350,"
        "  600 -50,"
        "  400 -50,"
        "400 0 ))",blue);

    boost::geometry::correct(red);
    boost::geometry::correct(green);
    boost::geometry::correct(blue);
    /*boost::geometry::detail::overlay::has_self_intersections(red);
    boost::geometry::detail::overlay::has_self_intersections(green);
    boost::geometry::detail::overlay::has_self_intersections(blue);
*/
    boost::geometry::intersection(red,blue,output);
    printf("A\n");
    std::cout<<boost::geometry::dsv(blue)<<"\n";
    std::cout<<boost::geometry::dsv(green)<<"\n";
    std::cout<<boost::geometry::dsv(output)<<"\n";
    boost::geometry::intersection(green,blue,output);
    printf("B\n");
    boost::geometry::detail::overlay::has_self_intersections(output);
    printf("C\n");

    return 0;
}


