BambuStudio学习笔记:VoronoiOffset

# 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);

算法流程说明

  1. 图元分类预处理

    • 调用annotate_inside_outside标记所有图元位置属性
    • 示例:边界单元标记为CellCategory::Boundary
  2. 距离场构建

    • 通过signed_vertex_distances计算顶点到轮廓的带符号距离
  3. 偏移轮廓生成

    • 根据正/负offset_distance提取外/内轮廓
    • 自动处理圆弧离散化(由discretization_error控制精度)
  4. 交点处理

    • 使用edge_offset_contour_intersections处理偏移边与原始轮廓的相交

参数说明

参数名类型作用
offset_distancedouble偏移距离(正=外扩,负=收缩)
discretization_errordouble圆弧离散化最大误差(影响生成多边形精度)
threshold_alphadouble骨架生成阈值,过滤短小边

应用场景示例

// 输入多边形轮廓
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图元元数据
  • 符号距离场加速:快速计算顶点到轮廓的几何关系
  • 自适应离散化:平衡圆弧近似精度与计算效率
  • 双向偏移支持:统一处理内外轮廓生成逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值