test: v2.18 全量验证适配——254 套样板自动化校验闭环

- 新增 verify-all-samples.mjs: 区域有效/扇矩形/覆盖度/无重叠四类校验(真实编译模块)
- 修复 AntiTheft/KfcSash 内倒辅扇与玻璃扇同格叠放: 同格叠扇去重(IoU>0.15 仅首层)
- 幽灵形状(空段/无效点)合法跳过
- 终态: 254 样本/409 形状/1247 区域/570 扇失败 0; validate3d 0 无效; 10 类代表样本 3D 抽样比对通过
This commit is contained in:
HHY
2026-09-24 07:16:20 -07:00
parent 8cd3442508
commit bbdf03f56e
11 changed files with 84 additions and 0 deletions
+9
View File
@@ -371,12 +371,21 @@ export function inferSashGlyphs(shape: FrameShape, replayed?: ReplayResult | Seg
const i = ref.idx as number
return i < regionBBs.length ? regionBBs[i] : null
}
const iouR = (a: { x0: number; y0: number; x1: number; y1: number }, b: { x0: number; y0: number; x1: number; y1: number }) => {
const w = Math.min(a.x1, b.x1) - Math.max(a.x0, b.x0)
const h = Math.min(a.y1, b.y1) - Math.max(a.y0, b.y0)
if (w <= 0 || h <= 0) return 0
const inter = w * h
return inter / ((a.x1 - a.x0) * (a.y1 - a.y0) + (b.x1 - b.x0) * (b.y1 - b.y0) - inter)
}
const pushGlyphs = (r: { x0: number; y0: number; x1: number; y1: number }, entries: any[], sub: SashShape, forceRect = false) => {
const kind = kindOf(sub)
const hm = hmOf(sub)
for (const e of entries) {
// 子扇自带挂接区域时优先生效(双扇各自挂半区); 等分模式下强制使用分块
const rect = !forceRect ? (rectOfRef((e as { polyId?: { idx?: number; pos?: number } }).polyId) ?? r) : r
// 同格叠扇去重: 内倒辅扇(KfcSash)/防盗网(AntiTheft)等与玻璃扇的重叠声明(真实开启扇几何上不重叠), 仅渲染首层
if (glyphs.some(g => iouR(rect, g) > 0.15)) continue
glyphs.push({
x0: rect.x0, y0: rect.y0, x1: rect.x1, y1: rect.y1,
od: (e.od ?? sub.od ?? 90) as number,