BambuStudio学习笔记:Voronoi

# Geometry::VoronoiDiagram 类概述

本类封装了Boost.Polygon库的Voronoi图算法,提供对点集和线段集的Voronoi图生成功能,支持错误检测与修复机制。主要应用于多边形中轴生成、3D打印路径规划等领域。关键特性包括:

- **多输入类型支持**:支持点集、线段集混合输入生成Voronoi图
- **错误诊断机制**:可检测非平面图、缺失顶点等常见问题
- **修复能力**:通过旋转输入等方式尝试修复损坏的Voronoi图
- **数据访问接口**:提供标准化容器访问方式

---

## 核心数据结构说明

### 成员变量

| 变量                   | 类型                      | 作用                                                                 |
|------------------------|---------------------------|----------------------------------------------------------------------|
| `m_voronoi_diagram`    | `voronoi_diagram_type`    | Boost库生成的原始Voronoi图                                           |
| `m_vertices`           | `vertex_container_type`   | 修改后的顶点容器(当进行修复时使用)                                 |
| `m_edges`              | `edge_container_type`     | 修改后的边容器                                                       |
| `m_cells`              | `cell_container_type`     | 修改后的单元容器                                                     |
| `m_is_modified`        | `bool`                    | 标记是否进行过图结构修改                                             |
| `m_state`              | `State`                   | 表示Voronoi图状态(是否需要/是否完成修复)                           |
| `m_issue_type`         | `IssueType`               | 记录检测到的问题类型                                                 |

### 枚举类型

#### `IssueType`
```cpp
enum class IssueType {
    NO_ISSUE_DETECTED,               // 无异常
    FINITE_EDGE_WITH_NON_FINITE_VERTEX, // 有限边连接无限顶点
    MISSING_VORONOI_VERTEX,          // 缺失必要顶点
    NON_PLANAR_VORONOI_DIAGRAM,      // 非平面结构
    VORONOI_EDGE_INTERSECTING_INPUT_SEGMENT, // Voronoi边与输入线段相交
    UNKNOWN                          // 未启用修复时的默认状态
};
State
enum class State {
    REPAIR_NOT_NEEDED,   // 原始图有效
    REPAIR_SUCCESS,   // 成功修复问题
    REPAIR_UNSUCCESSFUL, // 修复失败
    UNKNOWN              // 初始/未检测状态
};

关键成员函数详解

图构造方法

construct_voronoi 系列
template<typename SegmentIterator> void construct_voronoi(...)
template<typename PointIterator> void construct_voronoi(...)
template<typename PIter, typename SIter> void construct_voronoi(...)
  • 功能:根据输入类型(点/线段)构建Voronoi图
  • 参数
    • segment_begin/end:线段迭代器范围
    • p_first/last:点集迭代器范围
    • try_to_repair_if_needed:是否自动尝试修复问题
  • 实现:调用Boost.Polygon的构造方法,初始化状态为UNKNOWN

错误处理函数

detect_known_issues
template<typename SIter> static IssueType detect_known_issues(...)
  • 功能:静态方法检测Voronoi图问题
  • 检测逻辑
    1. 检查有限边是否连接非有限顶点
    2. 验证输入线段端点是否存在对应Voronoi顶点
    3. 检查Voronoi边是否与输入线段非法相交
try_to_repair_degenerated_voronoi_diagram
template<typename SIter> IssueType try_to_repair_degenerated_voronoi_diagram(...)
  • 修复策略
    1. 旋转输入坐标系(通过fix_angle参数)
    2. 重新生成Voronoi图
    3. 验证修复结果

数据访问接口

容器访问
const vertex_container_type& vertices() const
const edge_container_type& edges() const
const cell_container_type& cells() const
  • 作用:根据修改状态返回原始或修复后的图元素容器
状态查询
bool is_valid() const  // m_state != REPAIR_UNSUCCESSFUL
State get_state() const
IssueType get_issue_type() const

技术实现细节

Boost.Polygon集成

  • 自定义Segment适配:通过特化boost::polygon::segment_traits实现自定义线段类型的兼容
struct segment_traits<Slic3r::Geometry::VoronoiDiagram::Segment> {
    static point_type get(...)  // 端点访问适配
}

错误修复机制

  • 旋转修复法:当检测到非平面图等问题时,将输入坐标系旋转特定角度后重新生成
  • 容器拷贝:修复时通过copy_to_local()创建独立数据副本,避免修改原始Boost结构

类型系统

  • 坐标类型:使用double保证计算精度(coord_type = double
  • 迭代器约束:通过SFINAE技术限制模板参数必须符合点/线段概念

典型应用流程

  1. 初始化构造
    VoronoiDiagram vd;
    vd.construct_voronoi(segments.begin(), segments.end());
    
  2. 状态检查
    if (!vd.is_valid()) {
        auto issue = vd.detect_known_issues(...);
        vd.try_to_repair(...);
    }
    
  3. 数据获取
    for (const auto &edge : vd.edges()) {
        // 处理有效边
    }
    

注意事项

  • MSVC兼容:通过#pragma warning抑制Boost.Polygon的特定警告
  • 性能考量:修复操作涉及完整图重构,需谨慎处理大规模数据集
  • 坐标系一致性:旋转修复时需保持输入数据与Voronoi图坐标系同步
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值