diff --git a/docs/reference/布尔算法调研.md b/docs/reference/布尔算法调研.md new file mode 100644 index 0000000..e34ce68 --- /dev/null +++ b/docs/reference/布尔算法调研.md @@ -0,0 +1,253 @@ +# 全球布尔算法调研与借鉴 + +> 布尔运算是几何引擎的核心。本文梳理全球主流算法,分析可借鉴之处。 + +--- + +## 一、布尔算法分类全景 + +``` + 布尔算法 + │ + ┌─────────────────┼─────────────────┐ + │ │ │ + B-Rep 布尔 网格布尔 体素布尔 + (精确/拓扑) (近似/三角面) (离散/体素) + │ │ │ + ┌────┴────┐ ┌────┴────┐ ┌────┴────┐ + SSI法 分类法 BSP树法 射线法 SDF法 八叉树法 + │ │ │ │ │ │ +Parasolid ACIS Cork Manifold VDE-SDF OpenVDB + CGM 早期VDE Carve 早期VDE +``` + +--- + +## 二、B-Rep 布尔(精确法) + +### 2.1 SSI 法(Surface-Surface Intersection) + +**代表**: Parasolid、CGM + +``` +算法流程: +1. 对每对面 (Face_A, Face_B),计算曲面-曲面交线 +2. 用交线分割两个面 → 生成裁剪曲面片段 +3. 分类每个面片段(IN/OUT/ON) +4. 缝合保留的面片段 +5. 拓扑验证 → 修复 +``` + +| 优点 | 缺点 | +|------|------| +| 结果精确,保持NURBS精度 | SSI本身极难(数值不稳定) | +| 布尔后仍是B-Rep,可继续编辑 | 退化情况多(共面/共线/切触) | +| 工业标准做法 | 计算量大 | + +**借鉴点**: +- SSI的退化分类体系:Parasolid 将退化分为7类(tangent contact / curve overlap / surface overlap / 高阶接触 / 边界接触 / 顶点接触 / 非流形接触),每类有专门处理路径 +- **VDE 当前**: SSI 只有基础退化检测,缺少分类体系 → **应借鉴** + +--- + +### 2.2 分类法(Face Classification by Ray Casting) + +**代表**: ACIS、早期 VDE(centroid分类) + +``` +算法流程: +1. 取每个面的中心点(centroid) +2. 对对方体做射线投射 +3. 统计射线穿过面数 → 奇数=内部/偶数=外部 +4. 根据布尔类型保留/丢弃面 +5. 缝合 +``` + +| 优点 | 缺点 | +|------|------| +| 实现简单 | 中心点在边界上时分类错误 | +| 速度快 | 凹面/薄壁件容易误判 | +| | 无交线信息,无法精确切割 | + +**借鉴点**: +- ACIS 的改进:不是单点,而是**多点采样+投票**,降低误判率 +- **VDE 当前**: 单中心点分类 → **应改为多点采样** + +--- + +### 2.3 精确算术法(Exact Arithmetic Boolean) + +**代表**: CGAL Nef Polyhedra、Cork + +``` +算法流程: +1. 将所有几何转换为精确有理数(GMP/MPFR) +2. 用精确算术计算所有交点 +3. 构造半边结构 → 分类 → 输出 +``` + +| 优点 | 缺点 | +|------|------| +| 零浮点误差 | 极慢(100-1000x) | +| 100%正确(数学意义上) | 仅支持多面体,不支持NURBS | + +**借鉴点**: +- 不追求全精确,而是**自适应精度**:先用 double,检测到不确定时升到 GMP +- **VDE 当前**: exact_predicates 已实现但未集成到布尔 → **应集成** + +--- + +## 三、网格布尔(近似法) + +### 3.1 BSP 树法 + +**代表**: Cork(已停)、Carve(已停) + +``` +算法流程: +1. 对每个三角形构造半空间 +2. 用BSP树对所有三角形分类 +3. 根据布尔类型保留/丢弃 +``` + +| 优点 | 缺点 | +|------|------| +| 实现优雅 | BSP树构建O(n²)最坏 | +| 精确(对多边形) | 数值不稳定(共面三角形) | + +**借鉴点**: +- 已过时,不推荐借鉴 + +--- + +### 3.2 射线投射法 + +**代表**: Manifold、VDE mesh_boolean + +``` +算法流程: +1. 两个网格 → 求所有三角形交线 +2. 分割三角形 → 生成子三角形 +3. 每个子三角形中心点 → 射线投射分类 +4. 保留/丢弃子三角形 → 输出网格 +``` + +| 优点 | 缺点 | +|------|------| +| 实现直观 | 边界有锯齿 | +| 适合3D打印 | 面数膨胀 | + +--- + +### 3.3 Manifold 法 — 当前最先进的网格布尔 + +**代表**: Manifold (Emmett Lalish, 2022) + +``` +核心创新: 符号距离 + 拓扑保证 + +1. 使用 rational arithmetic(有理数)计算所有交点 +2. 使用 sweep-line 算法检测共面三角形 +3. 保证输出为 2-manifold(无悬边/无自交) +4. 增量布尔(支持连续布尔操作) +5. GPU 加速 +``` + +| 借鉴点 | VDE 现状 | +|--------|---------| +| **2-manifold 保证** | 无 → 应借鉴 | +| **增量布尔** | 无 → 可借鉴 | +| **共面三角形处理** | 无特殊处理 → 应借鉴 | +| **GPU加速** | 仅头部 → 可借鉴 | + +**为什么 Manifold 重要**: 它是当前唯一在网格布尔的**稳健性**上达到工业级的开源库。 + +--- + +## 四、体素布尔(离散法) + +### 4.1 SDF 法 + +**代表**: VDE-SDF、OpenVDB + +``` +算法流程: +1. 将B-Rep转换为SDF(符号距离场) +2. 对SDF值做 min/max 操作 = 布尔运算 +3. Marching Cubes 提取等值面 +``` + +| 优点 | 缺点 | +|------|------| +| 永不失败(数学保证) | 精度损失(离散化) | +| 支持复杂CSG | 无法保持B-Rep拓扑 | +| 天生并行 | 尖角/锐边被圆化 | + +**借鉴点**: +- SDF 布尔可做**快速预览**,用户确认后再做精确布尔 +- OpenVDB 的**自适应体素**(远处大格子,近处小格子)→ 可借鉴 + +--- + +### 4.2 八叉树法 + +**代表**: OpenVDB、MantaFlow + +``` +算法流程: +1. 用八叉树离散化空间 +2. 标记每个体素为 IN/OUT/ON +3. 提取边界体素 → 生成网格 +``` + +**借鉴点**: +- 自适应分辨率减少内存 +- 适合**大规模场景**(千万面级别) + +--- + +## 五、各算法的退化/容错策略对比 + +| 引擎 | 共面 | 切触 | 自交 | 薄壁 | 非流形 | +|------|------|------|------|------|--------| +| **Parasolid** | 容差分离 | 生成退化边 | auto-heal | 算法保证 | 不支持 | +| **ACIS** | 面重分类 | 容差融合 | 跳过 | 特殊处理 | 有限支持 | +| **Manifold** | 有理数精确 | sweep-line | 保证2-manifold | 薄壁=退化 | 不支持 | +| **CGAL Nef** | 精确 | 精确 | 精确 | 理论上支持 | 支持 | +| **VDE 当前** | 基础检测 | 基础检测 | heal尝试 | 未处理 | 不支持 | + +--- + +## 六、VDE 布尔优化路线图 + +### 短期(立即可做) + +| # | 借鉴来源 | 改进项 | 工作量 | +|---|---------|--------|--------| +| 1 | Parasolid | SSI退化7类分类 → 每类有专门处理路径 | 中 | +| 2 | ACIS | 多点采样投票 替代 单中心点分类 | 小 | +| 3 | Manifold | 共面三角形 sweep-line检测 | 中 | +| 4 | VDE自身 | 集成 exact_predicates 到布尔分类 | 小 | + +### 中期 + +| # | 借鉴来源 | 改进项 | 工作量 | +|---|---------|--------|--------| +| 5 | Manifold | 2-manifold 输出保证 | 大 | +| 6 | Parasolid | 容差自适应:局部几何复杂度决定容差 | 中 | +| 7 | OpenVDB | 自适应体素的SDF布尔预览 | 中 | + +### 长期 + +| # | 借鉴来源 | 改进项 | 工作量 | +|---|---------|--------|--------| +| 8 | Manifold | 增量布尔(连续操作不退化) | 大 | +| 9 | Parasolid | 布尔失败诊断+自动恢复流水线 | 大 | + +--- + +## 七、一句话总结 + +> **布尔算法60年发展,工业级答案只有一个:SSI+自适应容差+退化分类。 +> VDE已有SSI雏形,缺的是Parasolid 35年积累的退化分类体系和容错策略。 +> Manifold 在网格布尔的2-manifold保证是近期最值得借鉴的创新。**