boost::polygon自定义多边形求交为空及构造函数必要性咨询
问题1:为什么必须实现CPoint(boost::polygon::point_data<int> pd)构造函数
你在polygon_mutable_traits<CPolygon>的set_points实现中,直接调用了std::list::insert插入输入迭代器范围内的元素:
t.insert(t.end(), input_begin, input_end);
Boost.Polygon内部执行布尔运算时,生成的中间点对象是内置的point_data<int>类型,insert操作需要将point_data<int>隐式转换为你的自定义CPoint类型,所以必须提供对应的转换构造函数才能完成编译。
如果不想写这个构造函数,只需要修改set_points的实现,用你已经实现的point_mutable_traits的construct方法构造自定义点即可:
template <typename iT> static inline CPolygon& set_points(CPolygon& t, iT input_begin, iT input_end) { t.clear(); for (iT it = input_begin; it != input_end; ++it) { t.push_back(gtl::construct<CPoint>(gtl::x(*it), gtl::y(*it))); } return t; }
问题2:交集结果为空的原因
你的代码存在三个错误导致多边形构造/识别错误,自然无法得到正确的交集:
- 数组越界访问:你定义的
pts和pts2数组都只有4个顶点元素,但调用set_points时传入的结束位置是pts+5,相当于读取了数组外的内存垃圾值,构造出来的多边形完全不符合你的预期。正确的结束位置应该是pts+4,修改后:
gtl::set_points(poly, pts, pts+4); // 同理poly2的设置 gtl::set_points(poly2, pts2, pts2+4);
- 多边形缠绕方向不匹配:你在
polygon_traits中指定了clockwise_winding(顺时针缠绕),但你构造两个多边形的顶点序列都是逆时针顺序,方向不匹配可能导致Boost.Polygon将多边形识别为无效区域。可以修改顶点顺序为顺时针,或者将winding返回值改为unknown_winding让库自动检测方向。 - 面积断言逻辑错误:你构造的菱形对角线长度为12,面积是
(12*12)/2 = 72,和你断言的100完全不符,修改断言或者调整顶点坐标即可。
修改完上述问题后,交集运算就能返回正确的结果,返回的vector size不再是0。
内容的提问来源于stack exchange,提问作者Андрей Петров
相关产品推荐
相关产品推荐

