Files
ViewDesignEngine/docs/01-需求分析/06-精度提升方案调研.md
T
ViewDesignEngine 029dd6b75a
CI / Build & Test (push) Failing after 31s
CI / Release Build (push) Failing after 31s
feat: v0.6.0 精度提升 — Shewchuk Level C + 分层容差 + 业内方案调研
精确谓词: Shewchuk Level B → Level C (expansion arithmetic)
  - Dekker split + Two-Product + Two-Sum + Expansion 4-component
  - orient_2d/3d 自适应精度,支持大坐标(>1e14)
  - in_circle 扩展精度

容差系统: 单级 → 分层
  - Tolerance::tighten/relax 继承
  - Tolerance::min 合并取更严格
  - ToleranceScope 作用域临时容差
  - 预设容差级别: Modeling/Fitting/Intersection/Snapping

文档: 新增 06-精度提升方案调研 (252行)
  - 6种主流精度方案对比
  - Parasolid/ACIS/OCCT/CGAL 商业内核解密
  - VDE v0.6-v2.0 精度提升路线图
2026-07-23 09:58:38 +00:00

7.6 KiB
Raw Blame History

几何引擎精度提升 — 业内方案调研

调研时间:2026-07-23

目录

  1. 精度问题的根源
  2. 主流方案总览
  3. 方案一:自适应浮点谓词 Shewchuk
  4. 方案二:惰性精确求值 CGAL
  5. 方案三:容差建模 Tolerant Modeling
  6. 方案四:拓扑固定与吸附 Snapping
  7. 方案五:区间算术
  8. 方案六:多精度算术 GMPMPFR
  9. 商业内核方案解密
  10. 对 VDE 的建议路线

1. 精度问题的根源

IEEE 754 双精度浮点有 53 位尾数(约 15-16 位有效数字)。

场景 问题 示例
大坐标减法抵消 两个大数相减丢失精度 (1e15+1) - 1e15 = 0
行列式计算 乘积累加累积舍入误差 orient_2d/3d 符号误判
除法截断 交点坐标不精确 两线交点偏离真实位置
迭代累积 每次操作误差叠加 布尔运算链式操作

关键文献

  • Kahan (1965): "Pracniques: further remarks on reducing truncation errors"
  • Dekker (1971): "A floating-point technique for extending the available precision"
  • Shewchuk (1997): "Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates" (引用 >2000 次)

2. 主流方案总览

方案 精度提升 性能损失 实现难度 代表
自适应谓词 ~10⁻³⁰ 2-5x CGAL
惰性精确求值 完全精确 5-50x CGAL Lazy_kernel
容差建模 应用层保证 ~0% Parasolid, ACIS
拓扑吸附 拓扑一致 10-20% OCCT ShapeHealing
区间算术 结果带边界 2-10x Boost.Interval
多精度(GMP) 完全精确(任意) 50-500x CGAL Gmpq kernel

3. 方案一:自适应浮点谓词 Shewchuk

原理

不直接使用 GMP,而是用浮点运算模拟更高精度:

阶段 1: 用普通 double 计算行列式
阶段 2: 计算误差边界 (error bound)
阶段 3: 如果 |det| > error_bound → 结果可靠,返回
阶段 4: 否则,用 Dekker 分裂 + 扩展精度补偿项重算
阶段 5: 还不够 → 继续增加精度级别

Shewchuk ABCD 四级

级别 方法 速度
Level A 普通 double 最快
Level B double + 补偿项 (Dekker) 2x
Level C 扩展精度 (2-4 doubles) 5x
Level D 全自适应 (自动升级) 10x

关键子算法

  • Dekker Split: 将 double 拆成 hi + lo,各 26 位有效数字
  • Two-Sum / Fast-Two-Sum: 精确计算 a+b 的结果和误差
  • Two-Product: 精确计算 a*b 的结果和误差

VDE 当前状态

已实现 Level B。可升级到 Level C。


4. 方案二:惰性精确求值 CGAL

CGAL 双层架构

每个几何对象存储两份数据:
┌─────────────────────────────────────┐
│  Fast approximation (double)        │ ← 99% 操作在这里完成
│  Exact representation (expression)  │ ← 仅当 double 不够时才求值
└─────────────────────────────────────┘

表达式 DAG: 不立即计算精确值,而是构建表达式树。点到精确坐标时才递归展开。

对 VDE

架构改动大,建议 v2.0 考虑。


5. 方案三:容差建模 Tolerant Modeling

Parasolid/ACIS 的核心策略

容差类型 Parasolid 默认值 说明
全局建模容差 1e-6 所有几何操作的默认精度
位置容差 1e-5 两点距离 < 此值视为重合
角度容差 1e-11 rad 线面角的容差
边拟合容差 1e-3 曲线拟合时允许的偏差

分层容差

全局容差 → 部件容差 → 实体容差 → 面容差 → 边容差(自适应)

当判定重合时:

if distance(a, b) < max(tol_a, tol_b):
    a 和 b 重合 → 拓扑合并

6. 方案四:拓扑固定与吸附 Snapping

原理

当计算产生的新点(如交点)与已有拓扑元素距离 < 容差时,不创建新拓扑,而是吸附到已有元素。

OCCT ShapeHealing 迭代策略

第1轮: 粗吸附(coarse snap, tol=1e-3
第2轮: 细吸附(fine snap, tol=1e-5
第3轮: 拓扑修复(remove small edges, close gaps

7. 方案五:区间算术

每个值存储为 [下界, 上界] 区间:

运算规则:
  [a,b] + [c,d] = [a+c, b+d]
  [a,b] × [c,d] = [min(ac,ad,bc,bd), max(ac,ad,bc,bd)]

几何判定:
  如果 [a_lo, a_hi] > [b_lo, b_hi] → 确定 a > b
  如果区间重叠                 → 无法确定,需要更高精度

对 VDE: 高适用性。Boost.Interval 可直接使用。


8. 方案六:多精度算术 GMP/MPFR

精度 相对 double 的性能损失
53 位(double) 1x
113 位(quad) 10-30x
256 位 30-100x
512 位 100-500x

对 VDE: 作为可选后端 (VDE_USE_GMP=ON)。


9. 商业内核方案解密

Parasolid (Siemens)

技术 说明
Tolerant Modeling 全局 + 局部容差体系
容差传递 布尔运算后沿拓扑链传递收紧的容差
回退策略 浮点计算失败 → 回退到有理数计算

ACIS (Dassault/Spatial)

技术 说明
SPAresabs 绝对容差,默认 1e-5
SPAresnor 相对容差,默认 1e-6
拓扑容差链 face→loop→coedge→edge→vertex 逐级收紧

OCCT (Open Cascade)

技术 说明
Precision::Confusion() 默认 1e-7
Precision::Angular() 默认 1e-7 rad
ShapeHealing 自动修复工具包
拓扑共享 边/顶点在面之间共享,容差自动适配

CGAL

Kernel 配置 精度 速度
Exact_predicates_inexact_constructions 谓词精确,构造近似 中等
Exact_predicates_exact_constructions 完全精确
Filtered_kernel 双层过滤 快速+安全

CGAL 的关键洞察: 谓词必须精确(影响判定正确性),构造可以近似(影响显示精度)。这是性价比最高的策略。


10. 对 VDE 的建议路线

当前评估

层级 VDE 当前 对标
谓词精度 Level B (Dekker) → Level C
容差系统 全局单级 → 分层
拓扑修复 基础实现 → 吸附+迭代
精确计算 → 可选 GMP
惰性求值 → v2.0

阶段提升路线

v0.6.0 (近期 1-2 周):
  ├── 分层容差系统(LocalTolerance + 容差继承)
  ├── Shewchuk Level C (expansion arithmetic)
  ├── 顶点吸附(vertex snapping)
  └── 容差感知的交点计算

v1.0.0 (中期):
  ├── GMP/MPFR 可选后端
  ├── 容差传递机制
  └── 自动拓扑修复流水线

v2.0.0 (远期):
  └── 惰性精确求值框架(与 CGAL 同级)

最小可行提升 v0.6.0 关键指标

指标 当前 v0.6 目标 商业内核
orient_2d 大坐标正确性 90% 99.99% 99.999%
布尔运算退化通过率 60% 90% 99.9%
网格修复成功率 50% 85% 99%