插值
-
假如我們知道起點(diǎn)(start) 编检、終點(diǎn)(end)和持續(xù)的時(shí)間(duration), 假如勻速的話,很容易計(jì)算某時(shí)你的位置
通過以上公式 可以算出速度(v= 距離 / 時(shí)間)逗宜,然后知道當(dāng)前時(shí)間(t1)就可以算出當(dāng)前位置。
動(dòng)畫的插值算法類似這種
let pAniamation = CABasicAnimation(keyPath: "position")
pAniamation.fromValue = CGPoint(x: 248, y: 186)
pAniamation.toValue = CGPoint(x: 248, y: 300)
pAniamation.duration = 2.0
我們通過指定 fromValue toValue 和 duration 就可以通過默認(rèn)的timing function 算出每個(gè)時(shí)間點(diǎn)的位置
d = e - s
v = (e -s ) / t
c = s + ((e - s )/t * t1)
c = s + (e - s) * (t1 / t)
set p = t1 / t (時(shí)間的比率)
c = s + (e - s) *p
這是在勻速下 我們知道p 就可以算出當(dāng)前位置了剥啤。
定義兩個(gè)概念
- 時(shí)間變化率 =當(dāng)前時(shí)間 / 總時(shí)間 用符號(hào) pt = t1 / t
- 距離變化率 =當(dāng)前距離 / 總距離 用符號(hào) pd = c / d
類比以上公式 距離變化率 * 總距離 加 起點(diǎn) 等于 當(dāng)前距離
c = s + (e - s ) * pd
知道pd 就可以算出每時(shí)每刻的位置
我們不知道 pd锦溪。 pd是需要我們計(jì)算的, 但我們知道pt 知道當(dāng)前時(shí)間
假設(shè)pd和pt之間的關(guān)系是 pd = f(pt)
則上述公式變?yōu)?c = s + (e - s ) * f(pt)
只要找出 pd 與 pt 的關(guān)系就好
幸運(yùn)的是 這個(gè)關(guān)系你可以指定府怯,不需要求解刻诊。
如果 pd = pt
如果 pd = pt * pt
不同的timingfunction 代表 pd 與 pt 的不同函數(shù)