# VoronoiOffset 类概述
本模块基于Boost.Polygon生成的Voronoi图实现多边形偏移算法,支持内外轮廓生成及圆弧离散化。核心功能包括Voronoi图元分类、带符号距离计算及偏移轮廓生成,主要应用于3D打印中的轮廓偏移路径规划。
---
## 核心数据结构与枚举
### 图元分类标记
```cpp
// 顶点分类:标识Voronoi顶点相对于输入多边形的位置
enum class VertexCategory {
OnContour, // 精确位于输入轮廓上
Inside, // 位于轮廓内部(考虑孔洞)
Outside, // 位于轮廓外部
Unknown // 未分类状态
};
// 边分类:根据目标顶点方向标记边的指向
enum class EdgeCategory {
PointsToContour, // 指向轮廓
PointsInside, // 指向内部
PointsOutside, // 指向外部
Unknown // 未分类状态
};
// 单元分类:标识Voronoi单元整体位置属性
enum class CellCategory {
Boundary, // 被输入线段分割为内外部分
Inside, // 完全位于内部
Outside, // 完全位于外部
Unknown // 未分类状态
};
关键功能函数解析
图元访问辅助
// 获取与Voronoi单元关联的线段端点
const Point& contour_point(const VD::cell_type &cell, const Line &line);
// 转换Voronoi顶点为二维坐标点
Vec2d vertex_point(const VD::vertex_type &v);
分类标记操作
// 获取/设置顶点分类标记
VertexCategory vertex_category(const VD::vertex_type &v);
void set_vertex_category(VD::vertex_type &v, VertexCategory c);
// 获取/设置边分类标记
EdgeCategory edge_category(const VD::edge_type &e);
void set_edge_category(VD::edge_type &e, EdgeCategory c);
// 获取/设置单元分类标记
CellCategory cell_category(const VD::cell_type &v);
void set_cell_category(const VD::cell_type &v, CellCategory c);
预处理函数
// 重置所有分类标记为Unknown
void reset_inside_outside_annotations(VD &vd);
// 根据输入线段对Voronoi图进行内外部分类
void annotate_inside_outside(VD &vd, const Lines &lines);
距离计算
// 计算顶点到输入轮廓的带符号距离(负=内,正=外)
std::vector<double> signed_vertex_distances(const VD &vd, const Lines &lines);
偏移处理核心
// 计算边偏移与轮廓的交点
std::vector<Vec2d> edge_offset_contour_intersections(...);
// 生成粗粒度骨架边
std::vector<Vec2d> skeleton_edges_rough(...);
// 主偏移函数(带预计算距离版本)
Polygons offset(const VD &vd, const Lines &lines,
const std::vector<double> &signed_vertex_distances,
double offset_distance, double discretization_error);
// 主偏移函数(完整流程版)
Polygons offset(const VD &vd, const Lines &lines,
double offset_distance, double discretization_error);
算法流程说明
-
图元分类预处理
- 调用
annotate_inside_outside
标记所有图元位置属性 - 示例:边界单元标记为
CellCategory::Boundary
- 调用
-
距离场构建
- 通过
signed_vertex_distances
计算顶点到轮廓的带符号距离
- 通过
-
偏移轮廓生成
- 根据正/负
offset_distance
提取外/内轮廓 - 自动处理圆弧离散化(由
discretization_error
控制精度)
- 根据正/负
-
交点处理
- 使用
edge_offset_contour_intersections
处理偏移边与原始轮廓的相交
- 使用
参数说明
参数名 | 类型 | 作用 |
---|---|---|
offset_distance | double | 偏移距离(正=外扩,负=收缩) |
discretization_error | double | 圆弧离散化最大误差(影响生成多边形精度) |
threshold_alpha | double | 骨架生成阈值,过滤短小边 |
应用场景示例
// 输入多边形轮廓
Lines contour_lines = ...;
// 生成Voronoi图
Geometry::VoronoiDiagram vd;
vd.construct_voronoi(contour_lines.begin(), contour_lines.end());
// 分类图元
Voronoi::annotate_inside_outside(vd, contour_lines);
// 外扩0.5mm,精度0.01mm
Polygons expanded = Voronoi::offset(vd, contour_lines, 0.5, 0.01);
// 内缩0.3mm
Polygons shrunk = Voronoi::offset(vd, contour_lines, -0.3, 0.01);
技术亮点
- Boost.Polygon深度整合:通过颜色标记扩展Voronoi图元元数据
- 符号距离场加速:快速计算顶点到轮廓的几何关系
- 自适应离散化:平衡圆弧近似精度与计算效率
- 双向偏移支持:统一处理内外轮廓生成逻辑