轉自:http://www.cnblogs.com/rubylouvre/archive/2009/09/17/1567607.html
js中實現緩動效果,前不久在公司的項目中,要用到js來做圖片緩動切換的效果,雖然之前了解過一些關於js實現緩動的效果,但是實際要用的時候,還是感覺和想象中的不一樣。
所以今天有空拿出時間來具體做下,體驗一下。
js做緩動主要是用到Tween這個算法
關於Tween算法的原理分析
要說起Tween算法,就要談到數學中的函數問題了。
問題:怎么求函數關於某個點對稱后的函數?
例如:求函數 f(x) = x+(2/x) 關於點(1,2)的對稱函數?
解:
//解 這個字真是好熟悉啊,有木有感覺,之前不知道寫了多少遍了。
設要求的函數為 g(x),它上的一點為 (x,y)
它關於點 (1,2) 的對稱點為 (x0,y0)
通過中點坐標公式得到它們的關系如下:
x+x0=2*1 --> x0=2-x
y+y0=2*2 --> y0=4-y
也就是說:x+x0=(y+y0)/2
而點(x0,y0) 在函數 f(x) 上,所以有如下關系:
y0 = x0+(2/x0)
未完,待續,在下先去睡下,哈哈,……
這樣將 y0, x0分別代換為 x,y 便能得出 x,y 的關系:
4-y = 2-x+(2/(2-x)) --> y = 2+x-2/(2-x)
即:f(x) = x+2/x 關於點 (1,2) 的對稱函數為 g(x) = 2+x-2/(2-x)
那么再進一步
問題:求已知函數關於一條直線的對稱函數的解析式
如:Y = X^2+1 關於 Y=X 的對稱函數的解析式?
解:設點a(x,y) 在函數 Y = X^2+1 上
則點a(x,y) 關於 Y=X 的對稱點b(x',y') 在函數Y=X^2+1的對稱函數上
a b 的中點 c 在Y=X 上
而c的坐標為 [(x+x')/2, (y+y')/2], 由c在Y=X上,得出
(y+y')/2 = (x+x')/2 (1)
設直線 ab 的斜率為 Kab ,那么,因為 直線ab與 Y=X 垂直, Y=X的斜率為1
則有 Kab*1=-1,而 Kab = (y-y')/(x-x'),即:
(y-y')/(x-x') = -1 (2)
由 (1) (2) 得:
x'=y
y'=x
設 a(x,y) 在函數Y=X^2+1上,將 x'=y ,y'=x 代入方程
Y=X^2+1 得:x'=y'^2+1
這就是要求的函數的解析式
下面再看一個例子:var Tween = {
Quad: {
easeOut: function(t,b,c,d){
return -c *(t/=d)*(t-2) + b;
}
}
}
var b=50,c=300,d=100,t=0;
function Run(){
div.style.left = Math.ceil(Tween.Quad.easeOut(t,b,c,d)) + "px";
if(t<d){ t++; setTimeout(Run, 10); }
}
Run();
其中:
t: current time(當前時間);
b: beginning value(初始值);
c: change in value(變化量);
d: duration(持續時間)。