C++ Boost::几何体相交未按预期工作
我有一个小测试应用程序,可以将几个矩形与boost::geometry相交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
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);