Files
杨豪 cae37465d2 feat: 尺度精修上线,首次机器 PASS(live_160548 s=1.0375)
- method_l_shape: OK 候选尺度 ±0.0375 精修(步长 0.0125 + ±6px 窗口),
  GT live_165204 Δ 179→176(真人 177),离线 9/10 保持
- 插桩 JSON.stringify 捕获 SDK 日志明文;指针 probe 排除 coalesced/pressure
- 拖动不跟手指标作废:post_pos 晚于 SDK 重置滑块,鼠标事件流始终完整
- 剩余 VerifyErr = 候选整体选错(视觉确证),方向:多候选质量评估
- docs: experiments/solution/retrospective 同步收尾
2026-09-15 16:20:05 +08:00

79 lines
2.8 KiB
Python

"""把稀疏真人重放点加密为 ~60Hz 事件流:样条插值 + 速度起伏 + 微抖动。"""
import random
def enrich(pts, seed=None, hz=60.0):
"""pts: [(dx, dy, dt_ms)] 相对增量序列 → 加密为同格式,保持总位移/总时长不变。
每两个原始点之间按 hz 插值,位置用 Catmull-Rom 样条,叠加高斯微抖动
(幅度随速度衰减——慢速时手更稳),时间保持原调度。"""
rng = random.Random(seed)
# 累计成绝对轨迹
abs_pts = [(0.0, 0.0, 0.0)]
t = 0.0
x = y = 0.0
for dx, dy, dt in pts:
t += dt
x += dx
y += dy
abs_pts.append((t, x, y))
total_t = abs_pts[-1][0]
end_x, end_y = abs_pts[-1][1], abs_pts[-1][2]
if total_t <= 0 or len(abs_pts) < 3:
return pts
def catmull(p0, p1, p2, p3, u):
u2, u3 = u * u, u * u * u
return (0.5 * ((2 * p1) + (-p0 + p2) * u +
(2 * p0 - 5 * p1 + 4 * p2 - p3) * u2 +
(-p0 + 3 * p1 - 3 * p2 + p3) * u3))
out = []
step = 1000.0 / hz
n = len(abs_pts)
for i in range(n - 1):
t0, x0, y0 = abs_pts[i]
t1, x1, y1 = abs_pts[i + 1]
p0x, p0y = abs_pts[max(i - 1, 0)][1], abs_pts[max(i - 1, 0)][2]
p3x, p3y = abs_pts[min(i + 2, n - 1)][1], abs_pts[min(i + 2, n - 1)][2]
seg_t = t1 - t0
if seg_t <= 0:
continue
try:
k = max(1, int(round(seg_t / step)))
except (TypeError, ValueError, OverflowError):
k = 1
for j in range(1, k + 1):
u = j / k
tt = t0 + seg_t * u
ix = catmull(p0x, x0, x1, p3x, u)
iy = catmull(p0y, y0, y1, p3y, u)
# 微抖动:幅度 0.6px,随段内速度比例衰减
speed = u if u < 0.5 else 1 - u
jitter = 0.6 * (0.3 + 0.7 * speed)
ix += rng.gauss(0, jitter)
iy += rng.gauss(0, jitter)
dt_ms = tt - (out[-1][0] if False else 0)
out.append([tt, ix, iy])
# 相对化 + 终点精确
prev_t, prev_x, prev_y = 0.0, 0.0, 0.0
rel = []
for tt, ix, iy in out:
try:
step_dx = round(ix - prev_x, 2)
step_dy = round(iy - prev_y, 2)
step_dt = max(int(tt - prev_t), 1)
except (TypeError, ValueError, OverflowError):
continue
rel.append((step_dx, step_dy, step_dt))
prev_t, prev_x, prev_y = tt, ix, iy
if rel:
ex, ey, et = rel[-1]
try:
fix_x = float(end_x) - sum(p[0] for p in rel[:-1])
fix_y = float(end_y) - sum(p[1] for p in rel[:-1])
except (TypeError, ValueError):
fix_x, fix_y = ex, ey
rel[-1] = (round(fix_x, 2), round(fix_y, 2), et)
return rel