轨迹生成

轨迹是如何生成的

HEU-keep 使用椭圆分解算法来生成逼真的跑步轨迹。核心思路是:先生成一个标准的体育场形椭圆(两个半圆 + 两条直道),然后逐点施加多层噪声——随机游走漂移、GPS 量化抖动、以及圈与圈之间的参数随机变异——来模拟真实跑者产生的不完美轨迹。

四段式单圈构造

田径场的一圈被分解为四个连续的几何段,按照顺时针跑者经过的顺序:

  1. 右半圆——从角度 -π/2 到 π/2,参数方程 x = r·cos(θ), y = -r·sin(θ) + a
  2. 底部直道——从右到左的水平直线,固定像素步长
  3. 左半圆——从 π/2 到 3π/2,完成左侧弧线
  4. 顶部直道——从左到右,闭合回到起点

参数 r(半圆半径)和 a(直道半长)根据实际校园田径场的 Google Maps 卫星测量数据设定:南体育场 r≈36.5m, a≈42.5m(标准 400 米跑道);军工操场 r≈32m, a≈38m(较小)。

随机游走漂移

在几何构造的理想路径上叠加带衰减的随机游走:wanderX += (Math.random() - 0.5) × 1.5; wanderX *= 0.95。衰减因子 0.95 是关键——没有它漂移会无限累积,几圈之后轨迹就漂出场外了。有衰减后,约 40 个采样点(约 200 米)漂移就回归到零点附近。这在数学上是 Ornstein-Uhlenbeck 均值回归过程的离散模拟。

GPS 抖动

每个坐标点额外施加 ±1 像素的均匀随机偏移,模拟消费级 GPS 芯片(手机、运动手表)的量化噪声。GPS 真实精度约 ±3-5 米,在 1:200 比例尺的地图上换算为 ±15-25 像素的持续性偏差(由随机游走模拟),以及此处 ±1 像素的单次定位随机误差。

圈数变异和入场 stub

  • 圈数——随机生成 5 到 8 个完整圈,加上一个部分圈(占完整圈的 10%-40%)。部分圈的存在避免了轨迹精确闭合在起点——这种"不完美"让轨迹看起来更真实
  • 圈间变异——每一圈的半径随机偏移 ±3 像素,中心点小幅漂移 ±1-2 像素。相邻两圈不会完美重叠
  • 入场 stub——一条 7 点 Bézier 曲线从场外随机起点平滑连接到第一个圈起点,模拟跑者从场外进场
  • 整体旋转——整个轨迹通过 2D 旋转矩阵旋转 -4°,匹配校园田径场在卫星底图中的实际朝向

渐变色轨迹

当开启渐变色选项后,轨迹颜色在路径上持续变化。使用概率驱动的状态机——每个采样点投掷一次骰子(概率可配置,默认 0.5),触发颜色过渡。过渡使用二次 ease-in/ease-out 曲线在 RGB 空间中插值,目标颜色从暖绿到暖黄到红色的调色板中选取。Canvas 渲染为每个线段创建 createLinearGradient(),实现段间的平滑颜色流动。

手动绘制模式

除了自动生成,你也可以在预览卡片上直接用手画轨迹。draw_personalization.js 模块监听 pointerdown/move/up 事件,将每一条笔画记录为 {action, x, y} 坐标数组。这个数组可以 JSON 序列化保存并在之后重放。手动模式下的渐变色系统和自动模式完全一样。