本文介绍如何利用正弦函数为 canvas 中的图形创建平滑的往复运动——物体在两端减速停止、在中心加速,模拟自然物理节奏。核心是将时间映射到 [0, 1] 区间的正弦缓动函数,并线性映射到目标位置范围。
本文介绍如何利用正弦函数为 canvas 中的图形创建平滑的往复运动——物体在两端减速停止、在中心加速,模拟自然物理节奏。核心是将时间映射到 [0, 1] 区间的正弦缓动函数,并线性映射到目标位置范围。
要实现“正弦运动”(即具有自然加减速特性的往复运动),关键不在于对坐标做 Math.sin(x) 这类简单变换,而应将时间作为输入,通过正弦缓动函数生成 [0, 1] 范围内的平滑插值系数,再将其线性映射到实际像素区间。这样可确保运动轨迹连续、可预测,且完全避免手动方向翻转与边界检测带来的跳跃或误差。
推荐使用如下标准化缓动函数:
const easeSin = (t) => Math.sin(t - Math.PI / 2) * 0.5 + 0.5;
<canvas width="400" height="200"></canvas><style> canvas { border: 2px solid #333; } </style><script> const canvas = document.querySelector('canvas'); const ctx = canvas.getContext('2d'); const rad = 20; // 圆半径 const y = 100; // 垂直位置固定 const leftEdge = rad; // 左边界(防止裁剪) const rightEdge = canvas.width - rad; // 右边界 const easeSin = (t) => Math.sin(t - Math.PI / 2) * 0.5 + 0.5; function motion(timeStamp) { // 将时间缩放为合适频率(越小越慢,越大越快) const t = timeStamp * 0.001; const ease = easeSin(t); // 线性插值:[0,1] → [leftEdge, rightEdge] const x = leftEdge + ease * (rightEdge - leftEdge); // 清屏 & 绘制 ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.beginPath(); ctx.fillStyle = 'steelblue'; ctx.arc(x, y, rad, 0, Math.PI * 2); ctx.fill(); ctx.closePath(); requestAnimationFrame(motion); } requestAnimationFrame(motion);</script>
掌握这种基于时间的正弦插值思想,不仅能实现丝滑的往返运动,更是构建复杂交互动画(如呼吸效果、摆动、弹性反馈)的基础范式。
2026阿里开发者评选出的全国最佳教培机构小程序开发工具实测对比:附教培机构小程序制作教程
轻抖app如何实名认证 轻抖实名认证方法
2026全国3款AI/SAAS商城小程序开发工具推荐:附商城小程序开发教程
RFID硬件选型与实操:标签打印机和手持终端:这两个设备选错很麻烦
专访GEO落地工程师罗长才:当静止轨道已然成为技术融合的枢纽
2026年7月全国精选3款AI/SAAS实体店小程序制作工具推荐:附门店小程序制作教程