You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Canvas中实现正弦曲线运动效果?

实现正弦曲线式的往复运动(边缘减速、中间加速)

原代码存在的问题

  • 位置计算逻辑错误:x * Math.sin(q)将线性变化的x与正弦值相乘,无法实现预期的变速往复效果
  • 角度变量未正确更新:q=+1.0是赋值操作而非累加,导致正弦值固定,运动失去周期性
  • 方向切换逻辑为线性变速,无法实现边缘减速、中间加速的平滑过渡

修正思路

利用正弦函数的天然特性:

  • 正弦函数在0和π处导数为0(对应运动到边缘时速度为0)
  • 在π/2处导数最大(对应运动到中间位置时速度最快)
  • 定义运动区间范围,将正弦函数的输出值映射到该区间,通过持续累加角度变量实现平滑往复

修正后的代码

let angle = 0; // 随时间递增的角度变量
const minX = 50; // 运动左边界
const maxX = 200; // 运动右边界
const radius = 20; // 圆点半径
const centerX = (minX + maxX) / 2; // 运动区间中点
const range = (maxX - minX) / 2; // 运动半程距离

function motion() {
  requestAnimationFrame(motion);
  
  // 清空画布
  ctx3.fillStyle = "white";
  ctx3.fillRect(0, 0, canvas3.width, canvas3.height);
  
  // 计算当前x坐标:将正弦值映射到目标运动区间
  // Math.sin(angle)范围[-1,1],乘以range后映射为[-range, range],加上centerX得到[minX, maxX]
  const x = centerX + range * Math.sin(angle);
  
  // 绘制圆点
  ctx3.beginPath();
  ctx3.fillStyle = "blue";
  ctx3.arc(x, 100, radius, 0, 2 * Math.PI);
  ctx3.fill();
  ctx3.closePath();
  
  // 累加角度控制运动速度,数值越小运动越慢
  angle += 0.05;
}

代码说明

  • angle持续累加,驱动正弦函数周期性变化,自然实现往复运动
  • 位置计算逻辑直接利用正弦曲线的斜率变化,无需手动判断边界切换方向
  • 调整angle +=后的数值可控制运动快慢,数值越大运动速度越快

内容的提问来源于stack exchange,提问作者ofey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:02:38