Boost 1.58升级至1.66:geometry库self_turns函数参数适配问题
解决Boost 1.66中boost::geometry::self_turns()的参数变更问题
我之前升级Boost版本时也碰到过这个self_turns函数参数变化的坑,刚好能给你点实际的解决思路:
首先,先搞清楚新增的IntersectionStrategy参数是什么——它是Boost Geometry在1.60+版本中引入的策略类,用来控制自交点计算的精度、算法逻辑和性能表现,不同的策略对应不同的坐标系(笛卡尔、球面等)和计算需求。
最简单的修改:使用默认策略
如果你不需要自定义计算逻辑,直接传递默认构造的策略对象就能兼容旧代码,这也是最推荐的方式。
旧版本(1.58)的调用示例:
#include <boost/geometry/algorithms/self_turns.hpp> // 假设你原来的代码是这样的 boost::geometry::self_turns( your_geometry, // 输入几何对象 turn_results, // 存储交点结果的容器 boost::geometry::get_turn_info, // 提取交点信息的函数 boost::geometry::get_turn_point // 提取交点坐标的函数 );
升级到1.66后的修改:
#include <boost/geometry/algorithms/self_turns.hpp> #include <boost/geometry/strategies/intersection.hpp> boost::geometry::self_turns( your_geometry, turn_results, boost::geometry::get_turn_info, boost::geometry::get_turn_point, boost::geometry::default_intersection_strategy() // 新增的默认策略参数 );
自定义策略(如果需要更精准的控制)
如果你的几何类型是特定坐标系(比如球面、大地坐标系),或者需要调整计算精度,可以选择对应的策略实现:
- 笛卡尔坐标系:使用
boost::geometry::cartesian_intersection_strategy() - 球面/地理坐标系:使用
boost::geometry::spherical_intersection_strategy() - 自定义精度的线段交点策略:可以基于
boost::geometry::segment_intersection_strategy实现
举个笛卡尔坐标系的自定义例子:
auto strategy = boost::geometry::cartesian_intersection_strategy(); boost::geometry::self_turns( your_geometry, turn_results, boost::geometry::get_turn_info, boost::geometry::get_turn_point, strategy );
额外注意点
- 这个参数变更是Boost Geometry在1.60版本左右的重构内容,目的是把交点计算的逻辑解耦,让用户更灵活控制,同时修复了旧版本中一些精度问题
- 如果你使用了自定义的
get_turn_info或get_turn_point函数,需要确保它们的签名和新的策略参数兼容(一般默认的函数都是完全兼容的,不用修改)
内容的提问来源于stack exchange,提问作者Michael Burdinov
相关产品推荐
相关产品推荐

