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

如何使用boost::polygon对带孔多边形进行扩边/缩边操作?

使用Boost.Polygon实现带孔多边形的扩边/缩边操作

嗨,刚好我对Boost.Polygon的偏移操作有过实践经验,咱们一步步来解决你的需求~

核心思路

Boost.Polygon提供了offset函数专门处理多边形的扩缩边,而带孔多边形(polygon_with_holes_data<int>)需要先转换为polygon_set_data<int>来进行偏移操作——这个集合类型能自动处理多边形的拓扑关系(比如外框和孔洞的层级)。

前置准备

首先确保你包含了必要的头文件,并且引入命名空间(方便代码书写):

#include <boost/polygon/polygon.hpp>
#include <vector>

namespace bp = boost::polygon;
using Polygon = bp::polygon_with_holes_data<int>;
using PolygonSet = bp::polygon_set_data<int>;

另外,务必确保输入多边形的顶点顺序正确:外框是逆时针方向,孔洞是顺时针方向。如果不确定,可以用bp::correct函数修正:

bp::correct(inPoly); // 修正顶点顺序,避免偏移方向出错

a) 整体扩边:外框变大、孔洞缩小

扩边需要传入正的偏移距离,此时外框会向外扩张(变大),孔洞会向内收缩(变小)。如果你想要圆角/非平直边角,可以指定OFFSET_STRATEGY_ROUND(圆角)或者OFFSET_STRATEGY_MITER(斜切角)策略。

示例代码:

// 1. 将带孔多边形插入到多边形集合中
PolygonSet poly_set;
poly_set.insert(inPoly);

// 2. 执行扩边操作:偏移距离设为10(单位和你的坐标一致,比如像素),使用圆角策略
PolygonSet expanded_set;
bp::offset(expanded_set, poly_set, 10, bp::OFFSET_STRATEGY_ROUND);

// 3. 将结果转回带孔多边形(如果需要)
std::vector<Polygon> expanded_polys;
expanded_set.get(expanded_polys);
// 原图形是单个带孔多边形,所以expanded_polys[0]就是扩边后的结果

b) 整体缩边:外框变小、孔洞变大

缩边需要传入负的偏移距离,此时外框会向内收缩(变小),孔洞会向外扩张(变大),同样可以指定边角策略。

示例代码:

// 1. 同样先将输入多边形转为集合
PolygonSet poly_set;
poly_set.insert(inPoly);

// 2. 执行缩边操作:偏移距离设为-10,使用圆角策略
PolygonSet shrunk_set;
bp::offset(shrunk_set, poly_set, -10, bp::OFFSET_STRATEGY_ROUND);

// 3. 转回带孔多边形
std::vector<Polygon> shrunk_polys;
shrunk_set.get(shrunk_polys);
// shrunk_polys[0]就是缩边后的结果

关键细节说明

  • 边角策略选项:
    • bp::OFFSET_STRATEGY_SQUARE:直角延伸(默认,边角平直)
    • bp::OFFSET_STRATEGY_ROUND:生成圆角
    • bp::OFFSET_STRATEGY_MITER:斜切角(当内角过小时,可能会自动转为方形,可通过额外参数调整miter限制)
  • 拓扑变化处理:如果缩边时外框过小、或者孔洞扩得太大导致外框与孔洞连通,polygon_set会自动处理这种情况(比如变成无孔多边形,甚至空集合)。
  • 偏移距离:数值大小对应扩缩的幅度,单位和你的输入多边形坐标单位一致(比如像素、毫米等)。

内容的提问来源于stack exchange,提问作者Elmi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:27:49