C++ Boost::几何体相交未按预期工作

C++ Boost::几何体相交未按预期工作,c++,boost-geometry,C++,Boost Geometry,我有一个小测试应用程序,可以将几个矩形与boost::geometry相交 typedef boost::geometry::model::point < double, 2, boost::geometry::cs::cartesian > point; typedef boost::geometry::model::polygon<point > polygon; polygon Intersect(polygon p1, polygon p2) { st

我有一个小测试应用程序,可以将几个矩形与boost::geometry相交

typedef boost::geometry::model::point
<
double, 2, boost::geometry::cs::cartesian
> point;

typedef boost::geometry::model::polygon<point > polygon;

polygon Intersect(polygon p1, polygon p2) {
    std::vector < polygon > result;
    boost::geometry::intersection(p1, p2, result);
    return result.front();
}

polygon IntersectionTest() {
    polygon one, two, three, four;

    boost::geometry::read_wkt("POLYGON((35 25, 35 35, 15 35, 15 25, 35 25))", one);
    boost::geometry::read_wkt("POLYGON((45 30, 45 50, 25 50, 25 30, 45 30))", two);
    boost::geometry::read_wkt("POLYGON((50  0, 50 40, 10 40, 10  0, 50  0))", three);
    boost::geometry::read_wkt("POLYGON((40 20, 40 60,  0 60,  0 20, 40 20))", four);

    return Intersect(Intersect(Intersect(one, two), three), four);
}
typedef boost::geometry::model::point
<
double,2,boost::geometry::cs::笛卡尔
>点;
typedef boost::geometry::model::polygon;
多边形相交(多边形p1、多边形p2){
std::向量<多边形>结果;
几何图形:交集(p1,p2,结果);
返回result.front();
}
多边形相交测试(){
多边形一,二,三,四;
boost::geometry::read_wkt(“多边形((3525,3535,1535,1525,3525))”,1);
boost::geometry::read_wkt(“多边形((4530,4550,2550,2530,4530))”,2);
boost::geometry::read_wkt(“多边形((50,50,40,10,40,10,0,50))”,三个);
boost::geometry::read_wkt(“多边形((4020,4060,060,020,4020))”,四个);
返回Intersect(Intersect(一,二,三),四);
}
我一定做错了什么,因为我希望结果是类似于
(3530,3540,2540,2530,3530)
但是我得到了10个点长的多边形,其中包含像
50 0
这样的点,而平行矩形的交点应该始终是带有4+1点的矩形,
50 0
位于边缘,因此它根本不应该位于交点处。如果我把它放在一个长方形中,矩形看起来就像我所期望的那样


有什么不对劲?如果它是
boost::geometry
中的一个bug,我如何确保它是?(我目前使用的是1.48。)如果是一个bug,有没有办法避免这个问题?

多边形类有以下模板参数:

template
<
    typename Point,
    bool ClockWise = true,
    bool Closed = true,
    template<typename, typename> class PointList = std::vector,
    template<typename, typename> class RingList = std::vector,
    template<typename> class PointAlloc = std::allocator,
    template<typename> class RingAlloc = std::allocator
>
class polygon {...}
有了这个,结果将如您所期望的那样


作为个人评论,如果read\u wkt能够在阅读时强制执行正确的方向,那可能是一件好事。

我同意ds27680的答案

第三个选项是在阅读完wkt后调用boost::geometry::correct(几何体),如果用户不确定方向,建议用户这样做

read_wkt确实没有强制执行正确的方向。原因是正确的函数需要进行面积计算,如果用户知道多边形的顺序正确(通常已知),则可以保存面积计算

boost::geometry::read_wkt("POLYGON((35 25, 15 25, 15 35, 35 35, 35 25))", one);
boost::geometry::read_wkt("POLYGON((45 30, 25 30, 25 50, 45 50, 45 30))", two);