You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:交集结果为空的原因

你的代码存在三个错误导致多边形构造/识别错误,自然无法得到正确的交集:

  1. 数组越界访问:你定义的pts和pts2数组都只有4个顶点元素,但调用set_points时传入的结束位置是pts+5,相当于读取了数组外的内存垃圾值,构造出来的多边形完全不符合你的预期。正确的结束位置应该是pts+4,修改后:
gtl::set_points(poly, pts, pts+4);
// 同理poly2的设置
gtl::set_points(poly2, pts2, pts2+4);
  1. 多边形缠绕方向不匹配:你在polygon_traits中指定了clockwise_winding(顺时针缠绕),但你构造两个多边形的顶点序列都是逆时针顺序,方向不匹配可能导致Boost.Polygon将多边形识别为无效区域。可以修改顶点顺序为顺时针,或者将winding返回值改为unknown_winding让库自动检测方向。
  2. 面积断言逻辑错误:你构造的菱形对角线长度为12,面积是(12*12)/2 = 72,和你断言的100完全不符,修改断言或者调整顶点坐标即可。

修改完上述问题后,交集运算就能返回正确的结果,返回的vector size不再是0。

内容的提问来源于stack exchange,提问作者Андрей Петров

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:36:01