还是先讲原理,动手能力强的童鞋可以看了原理自己去鼓捣。 设有三角函数 y = Asin(ωx+φ) ,
第一步,我们要先利用高中的三角函数知识来计算出旗帜飘动(类似简谐运动)的第一帧 (设初相φ=0) 的曲线, 假设我们有一张图片,宽高分别为W、H,该图片包含n个周期,最大振幅为A,可得波长 λ = W / n ,ω = 2π / λ ,即可得出我们的三角函数:y = A · sin( 2π / λ · x ) ;
第二步,在W次循环中(逐像素),使用drawImage函数 来画出宽度1,高度H 的图片。
第三步,根据x轴偏移量修改振幅的系数。据本人“观察”,现实生活中,旗子的尾部摆动幅度更大。为了做到这个效果,修改三角函数为 y = A · ( x ÷ W ) · sin( 2π / λ · x ) ; (我使用的振幅变化是线性递增的,很遗憾本人的物理水平不咋地,不知道理想状况下振幅应该是怎样的变化关系,不过看的差不多就行了,)
第四步,给我们的第一帧画面添加时间轴,将曲线随时间往右平移来呈现动画效果,设频率为f,t 为上一帧到这帧的间隔,波速 v = λ · f ,修改我们的函数: y = A · ( x ÷ W ) · sin( 2π / λ · ( x - t · v )) ;
第五步,由于运动的坐标原点是左上角,所以超出的部分会被裁剪。我们先创建一个宽高分别为W和H+2 * A的 画布,然后将函数往下移动,是其正好被包裹,因为canvas坐标系与数学中的直角坐标系方向相反,所以要加上A,得到最终的函数: y = A · ( x ÷ W ) · sin( 2π / λ · ( x - t · v )) + A;
以上就是我们主要的步骤,角度需要换成弧度制。有些人可能会疑问,上一讲不是需要做一次反向平衡来防止旗帜的最左边也波动起来吗?最左边x轴坐标为0,代入我们的函数,得到y = 0,也就是振幅为0,所以就可以免去了上一讲的步骤,当然,如果你觉得我的“观察”没有啥依据,还是按照标准的三角函数( y = A · sin( 2π / T · ( x - t · v )) )来做,那么你需要在每一帧中,先计算出x=0时候的振幅,记为 y0 = A · sin( 2π / T · ( -t · v ÷ T )) ,然后将图形向上或者向下移动-y0 ,修改我们的函数: y = A · sin( 2π / T · ( x - t · v )) + A + y0 。