如何实现速滑运动员图像的椭圆运动?原代码仅支持圆周运动
实现速滑运动员的椭圆运动轨迹
嘿,这个问题太贴合实际了——速滑场本身就是椭圆形的,把圆周运动改成椭圆其实只需要调整核心的数学公式就行!
原理说明
原来的圆周运动用同一个半径r计算x、y方向的偏移,自然是正圆形轨迹:
var px = x + r * Math.cos(a); var py = y + r * Math.sin(a);
而椭圆运动需要区分x方向的半轴长度(rx)和y方向的半轴长度(ry),把两个方向的偏移幅度分开控制,公式就变成了:
var px = x + rx * Math.cos(a); var py = y + ry * Math.sin(a);
这样x方向会按照rx的幅度拉伸,y方向按照ry的幅度拉伸,组合起来就是完美的椭圆轨迹,刚好匹配速滑场的形状。
修改后的完整代码示例
// 椭圆圆心坐标 const x = 700; const y = 200; // 椭圆的长半轴和短半轴(根据速滑场实际比例调整) const rx = 300; // x方向半轴(对应速滑场的长轴) const ry = 150; // y方向半轴(对应速滑场的短轴) let a = 0; // 角度(范围0到Math.PI * 2) function rotate(a) { // 核心逻辑替换为椭圆计算公式 var px = x + rx * Math.cos(a); var py = y + ry * Math.sin(a); document.querySelector('#point').style.left = px + 'px'; document.querySelector('#point').style.top = py + 'px'; } // 用requestAnimationFrame实现平滑的持续动画 function animate() { a += 0.01; // 控制滑行速度,数值越大滑得越快 if (a > Math.PI * 2) { a = 0; // 角度重置,实现循环滑行 } rotate(a); requestAnimationFrame(animate); } // 启动动画 animate();
额外优化提示
- 你可以根据速滑场的实际尺寸微调
rx和ry的数值,标准400米速滑场的长轴和短轴比例大概是2:1,你可以按需调整。 - 如果想要更贴近真实速滑的运动感,还可以动态调整角度增量:比如在弯道区域减小
a += 0.01的数值模拟减速,直道区域增大数值模拟加速,这属于进阶的细节优化啦。
内容的提问来源于stack exchange,提问作者Jaylord2
相关产品推荐
相关产品推荐

