参考官方教程: buffer (with strategies) - 1.73.0https://www.boost.org/doc/libs/1_73_0/libs/geometry/doc/html/geometry/reference/algorithms/buffer/buffer_7_with_strategies.html某些场景下需要对多边形的边界进行一定距离的扩大或缩小,查找相关资料时发现了boost的geometry这个宝藏库,提供了个针对几何图形操作的接口,下面简单介绍一下对上面链接中官方buffer demo中的一个参数
"points_per_circle" 测试的理解,从变量命名的字面意思看是每圈的点数,估计可能是膨胀或缩小后的插值数,不太确定,于是写了个demo简单调试了一下。
采用ros在rviz工具作为可视化,将多边形边界点集发布为geometry_msgs::PolygonStamped消息, 假设原始边界为一个纵向200m(x轴方向,正向150m, 负方向50m), 横向100m(左右各50m)的矩形,原点x轴正向超上,y正向轴朝左.rviz Grid中每个格子10m.
在处理原始多边形形框的函数里如下
void BufferPolygon(
const PointArrayConstPtr &map_ptr, const float distance,
geometry_msgs::PolygonStampedPtr map_msg) {
// Declare strategies
// const double buffer_distance = 0;
// <=4就是9个点,>4(最少5个点)比扩展前点多就至少拐角补一个点,>2*size(最少9个点)补两个点
const int points_per_circle = map_ptr->array.size() + 1;
boost::geometry::strategy::buffer::distance_symmetric<double>
distance_strategy(distance);
boost::geometry::strategy::buffer::join_round join_strategy(
points_per_circle);
boost::geometry::strategy::buffer::end_round end_strategy(points_per_circle);
boost::geometry::strategy::buffer::point_circle circle_strategy(
points_per_circle);
boost::geometry::strategy::buffer::side_straight side_strategy;
boost::geometry::model::multi_polygon<polygon> mpol;
polygon map_polygon;
for (const auto &pt : map_ptr->array) {
boost::geometry::append(map_polygon, make<point_type>(pt.x, pt.y));
}
correct(map_polygon);
mpol.push_back(map_polygon);
// Declare output
boost::geometry::model::multi_polygon<polygon> result;
// Create the buffer of a multi polygon
boost::geometry::buffer(mpol, result, distance_strategy, side_strategy,
join_strategy, end_strategy, circle_strategy);
map_msg->polygon.points.resize(result[0].outer().size());
for (size_t i = 0; i < result[0].outer().size(); i++) {
map_msg->polygon.points[i].x = result[0].outer()[i].x();
map_msg->polygon.points[i].y = result[0].outer()[i].y();
map_msg->polygon.points[i].z = 0;
}
}
当边界为设定的矩形时,原始边框有4个点,当输入buffer distance>0时,经测试,当设置points_per_circle
<=4个点时,输出9个点(每个角多一个点,不插值,首尾点相连,加一个)
当>4(最少5个点)比扩展前点就至少拐角插值补一个点, 即输出多边形点数为(2+1)*4+1 = 13,
当>2*size(最少9个点)补两个点,即(2+2)*4+1 = 17,个点。
输出如下,注意边界拐角插值了两个点:
,
插值点数越多,拐角越平滑。