# P0：从“跑得完”到“判得对”

本轮新增 9 个几何验收测试、8 个检查器成对测试，并将原 S 形样条“点数大于 2”改为独立解析曲线误差比较。读取语料、实体数和警告数测试继续用于兼容回归，不作为几何正确性的唯一依据。

2026-10-22 另在 [`entity_wbtest.mbt`](../entity_wbtest.mbt) 增加两项非原点椭圆验收：圆心 (10,0)、长轴向量 (10,0)、轴比 0.5 的精确包围盒，以及三个平移量下字段、尺寸和逐顶点形状不变。当前解析算法已正确，本次补测试和旧错误检出证据；完整输入、预期、实际和误差见 [C1 补充](delivery-verification.md#c1-补充非原点椭圆与平移不变性2026-10-22)。

## 几何验收矩阵

另有[追加审查验收](review-cases.md)：11 项库测试与 11 个真实网页/CLI 案例验证面边界、原始角点、OCS、损坏多段线和 SVG 尺寸。新增存储顺序误用、保留三角形重复第四点两种语义故障，当前敏感性验收 10/10。

[`geometry_accuracy_wbtest.mbt`](../geometry_accuracy_wbtest.mbt) 从最小 DXF 文本开始，经扫描、结构读取、实体解码后调用公开接口。预期坐标和曲线不由生产离散器、变换或包围盒函数生成。

| 实体/变换 | 输入 | 结果断言 |
| --- | --- | --- |
| LINE | (-3,2,7)→(1,5,-2) | XYZ 字段、XY 两端点、长度 5；包围盒 (-3,2)～(1,5)，宽高 4×3 |
| CIRCLE | 圆心 (10,-4)，半径 3 | 每点半径 3；包围盒 (7,-7)～(13,-1)，直径 6；每条弦的弦高 ≤0.002 |
| ARC | 圆心 (-2,3)，半径 4，300°→60° | 跨零度逆时针弧，两端 (0,3±2√3)，X 范围 [0,2]；解析圆弧误差 ≤0.002 |
| ELLIPSE | 圆心 (10,20)，相对长轴 (3,4)，比值 0.5 | 首点 (13,24)，旋转椭圆方程；包围盒半宽 √13、半高 √18.25；解析误差 ≤0.002 |
| LWPOLYLINE | (2,3)→(6,3)，bulge=-1，再接 (6,0) | 弧在弦上方，圆心 (4,3)、半径 2；端点及接点顺序；包围盒 (2,0)～(6,5)，弧误差 ≤0.002 |
| 普通二维 POLYLINE | 闭合矩形 (-2,-1)～(4,3) | 四点坐标逐项相等；宽高 6×4，面积 24，周长 20 |
| 有理 SPLINE | 二次四分之一圆，控制点 (7,7)/(7,9)/(5,9)，权重依次 1、√0.5、1 | 端点 (7,7)/(5,9)，包围盒 (5,7)～(7,9)；每点距 (5,7) 为 2，解析圆弧误差 ≤0.002 |
| 三次 SPLINE | (0,0)/(0,1)/(1,-1)/(1,0)，钳制节点 | 与独立 Bernstein 多项式 x=3t²−2t³、y=3t(1−t)(1−2t) 比较，误差 ≤0.002；Y 极值接近 ±√3/6 |
| 普通 INSERT | 块基点 (1,2)，同心单位圆；插入 (-10,7)，缩放 (3,2)，旋转 90° | 世界坐标首点 (-10,10)，满足 ((x+10)/2)²+((y−7)/3)²=1；世界坐标解析椭圆误差 ≤0.002 |

端点和包围盒使用 1e-9 绝对误差；半径/椭圆方程使用 1e-10；直线长度和矩形面积/周长使用 1e-12。所有数值沿用输入坐标单位。

曲线比较 2049 个独立解析点到输出折线的距离，并反查每个输出顶点到解析采样折线的距离，避免单向距离漏掉多余偏离点。测试侧单独实现投影距离；圆、圆弧、椭圆、有理四分之一圆另验证点所在曲线的方程。有限采样不是对所有输入和浮点尺度的形式化证明；保留原有[独立 de Boor 对照](../geometry_regression_wbtest.mbt)覆盖其他样条节点和权重情形。

## 检查器成对验收

[`checker_accuracy_wbtest.mbt`](../checker_accuracy_wbtest.mbt) 核对 Finding 的分类、严重程度、图层/句柄或具体原因。正常对照明确断言相关检查项不存在。

| 项目 | 应报告 | 不应报告/边界 |
| --- | --- | --- |
| 非正半径 | -2 为致命、0 为警告，包含 CUT 图层、NEG/ZERO 句柄及半径原因 | 正半径圆无发现、无完整性缺失 |
| 闭合 | tol=0.01，缝 0.011 报闭合警告，包含实际缝值 | 缝 0.009 和恰好 0.01 不报；没有自交/重复误报 |
| 自相交 | 蝴蝶结报自交；平移 -100 后结论保持 | 正常矩形不报；蝴蝶结不误归为重复或开放 |
| 重复 | 反向完全重合长 4、部分重合长 2，核对报告长度 | 端点接触、偏移 0.011 大于 tol=0.01 不报重复 |
| 净距 | 阈值 1，嵌套矩形净距 0.5 报警，核对实际距离及图层 | 恰好 1、1.5 不报；min_gap=0 时不报；正常闭合边角无误报 |
| 接触/穿越 | 不同实体内部穿越报最小距离 0 | 端点连接不报净距；跨实体穿越不误报单实体自交 |
| 图层 | 同层重合报重复 | 相同坐标分属 CUT/OTHER，不报重复或跨层净距 |
| 零长段 | 重复顶点报零长段，包含 DUP-VERTEX 句柄和段数 | 正常矩形边角不报退化 |

## 验证测试能检出错误

[`scripts/verify-test-sensitivity.cjs`](../scripts/verify-test-sensitivity.cjs) 在系统临时目录复制源码、注入故障并清理。原项目源码不被修改。脚本要求错误版本先编译成功，再发生实际测试断言失败；编译/语法错误不算检出。

| 临时故障 | 实际检出结果 |
| --- | --- |
| SOLID/TRACE 将存储顺序当边界 | 11 项库验收中矩形两项失败，逐坐标和面积断言检出错误边界 |
| 三角形保留重复第四点 | 11 项库验收中三角形一项失败，三点边界和非零边长断言检出错误 |
| ELLIPSE 长轴向量再次减圆心 | 实体测试 57 项中 2 项失败，正是新增的精确包围盒与平移不变性测试；其余 55 项通过 |
| 所有轮廓 X 平移 0.25 | 9 个几何测试失败 |
| 样条直接返回端点直线 | 2 个测试失败；四分之一圆误差约 0.585786，S 形约 0.288675 |
| 负 bulge 取绝对值 | 1 个测试失败，镜像/包围盒错误 |
| 关闭净距检查 | 2 个测试失败，漏报被检出 |
| 正常图形强行加自交警告 | 7 个测试失败，误报被检出 |
| 净距 `<` 错改为 `<=` | 1 个测试失败，等值边界误报被检出 |

未修改的几何 / 检查器基线 17/17 通过，实体测试 57/57、追加库验收 11/11 通过；九类故障全部检出，敏感性脚本合计 10/10 验收通过。实际失败消息、退出码和测试源码 SHA-256 见 [`test-sensitivity-results.json`](test-sensitivity-results.json)。

## 复现与结果

仓库根目录执行：

```sh
moon test geometry_accuracy_wbtest.mbt checker_accuracy_wbtest.mbt --deny-warn
node scripts/verify-test-sensitivity.cjs
node scripts/verify-test-sensitivity.cjs --report docs/test-sensitivity-results.json
moon check --target all --deny-warn
moon test --deny-warn
moon test --target js --deny-warn
moon test --target native --deny-warn
moon test --target wasm-gc --deny-warn
```

本轮工具链为 moon 0.1.20260920、moonc v0.10.14。全目标检查通过；默认后端和 Windows Native 各 270/270，JS 和 Wasm-GC 各 253/253。不同后端适用包不同，数量不能当作覆盖率比较。Native 现有 async 依赖仍有一条 C4005 宏重定义警告，测试通过。

新测试随常规 CI 在默认、JS、Native 后端执行，故障检出脚本在 CI 中单独使用 Wasm-GC。本轮未修改生产算法，未修改生产源码的新增预期全部通过。此前[完整性验收](check-completeness.md)和[独立工程调用](../examples/consumer/README.md)仍保留。
