新闻详情
正弦插值 缓动在Scratch中的实现
来源:自贡童程童美少儿编程培训中心 时间:2016-05-30
很多Scratcher都有这样一个烦恼——系统自带的移动动画太生硬,做贝塞尔插值又太麻烦…
作为一个经验丰富Scratch爱好者,本作者在一番苦思后,终于找到了贝塞尔插值的平替——正弦插值。
相信大部分Scratcher都是学过一点点数学的,那么众所周知,sin(x)的函数图像是一条平滑的曲线。
补充一个小知识:线性插值↓
P=((x2-x1)t+x1, (y2-y1)t+y1)那么我们把sin(t)输入线性插值中的t,就得到了一次丝滑的正弦缓动:
((x2-x1)sin(t)+x1, (y2-y1)sin(t)+y1)
让我们插入速率v:
((x2-x1)sin(vt)+x1, (y2-y1)sin(vt)+y1)
再加入系数k和偏移b:
((x2-x1)k*sin(vt)+b+x1, (y2-y1)k*sin(vt)+b+y1)
我们的公式已经基本完善了。为了应对更多应用情景,我们定义0≤t≤1,再使t在min和max之间变化(做min和max的线性插值):
t1=(max-min)*t+min
让我们再把t1代入原公式中的t:
//简化公式((x2-x1)ksin(v((max-min)t+min))+b+x1, (y2-y1)ksin(v((max-min)t+min))+b+y1)//完整公式((x2-x1)*k*sin(v*((max-min)*t+min))+b+x1, (y2-y1)*k*sin(v*((max-min)*t+min))+b+y1)
大功告成!你还可以在Scratch中设置变量tick和总数ticktotal并将t设为tick/ticktotal,然后重复循环改变位置并增加tick即可。