# 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图问题
- 检测逻辑:
- 检查有限边是否连接非有限顶点
- 验证输入线段端点是否存在对应Voronoi顶点
- 检查Voronoi边是否与输入线段非法相交
try_to_repair_degenerated_voronoi_diagram
template<typename SIter> IssueType try_to_repair_degenerated_voronoi_diagram(...)
- 修复策略:
- 旋转输入坐标系(通过
fix_angle
参数) - 重新生成Voronoi图
- 验证修复结果
数据访问接口
容器访问
const vertex_container_type& vertices() const
const edge_container_type& edges() const
const cell_container_type& cells() const
状态查询
bool is_valid() const
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技术限制模板参数必须符合点/线段概念
典型应用流程
- 初始化构造
VoronoiDiagram vd;
vd.construct_voronoi(segments.begin(), segments.end());
- 状态检查
if (!vd.is_valid()) {
auto issue = vd.detect_known_issues(...);
vd.try_to_repair(...);
}
- 数据获取
for (const auto &edge : vd.edges()) {
}
注意事项
- MSVC兼容:通过
#pragma warning
抑制Boost.Polygon的特定警告 - 性能考量:修复操作涉及完整图重构,需谨慎处理大规模数据集
- 坐标系一致性:旋转修复时需保持输入数据与Voronoi图坐标系同步