- 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 同步收尾
79 lines
2.8 KiB
Python
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
|