x0 とし、終点座標を x1 、分割数を divCount とします。
var x0 = 50 ; // 始点のX座標
var x1 = 500 ; // 終点のX座標
var tmpCount = 0 ; // カウント
var divCount = 10 ; // 分割数
function move(){
if( tmpCount++ < divCount ){
var c = tmpCount/divCount ;
var x = ( x1-x0 )*c + x0 ;
layer.setPositionX( x );
setTimeout( "move();" , 10 );
}
}
f(c) としましょう。x = ( x1-x0 )*c + x0 + f(c) ( 但し、0 ≦ c ≦ 1 )f(c) がどんな関数かが問題ですが、先ほどのオフセット量の性質を満たす関数は sin 関数であると述べました。f(c) は以下のようになります。f(c) = a*sin( πc )x = ( x1-x0 )*c + x0 + a*sin( πc ) ・・・@ 但し、0 ≦ c ≦ 1
var x0 = 50 ; // 始点のX座標
var x1 = 500 ; // 終点のX座標
var tmpCount = 0 ; // カウント
var divCount = 10 ; // 分割数
var a = ??? ;
function move(){
if( tmpCount++ < divCount ){
var c = tmpCount/divCount ;
var x = ( x1-x0 )*c + x0 + a*Math.sin( Math.PI*c );
layer.setPositionX( x );
setTimeout( "move();" , 10 );
}
}
x = ( x1-x0 )*c + x0 + a*sin( πc ) ・・・@ 但し、0 ≦ c ≦ 1

図1.a > 0 のときの x=(x1-x0)*c+x0+a*sin(πc)のグラフ

図2.a < 0 のときの x=(x1-x0)*c+x0+a*sin(πc)のグラフ

図3.a = 1000 のときの x=(x1-x0)*c+x0+a*sin(πc)のグラフ
x0 ≦ ( x1-x0 )*c + x0 + a*sin( πc ) ≦ x1 ・・・Adx/dc = y = x1-x0 + πa*cos(πc) ・・・ D1 + πa/(x1-x0)*cos(πc) ≧ 0 ・・・ Eb = a/(x1-x0) ・・・ F1 + πb*cos(πc) ≧ 0 ・・・ E'∴ 1 - πb ≧ 0∴ b ≦ 1/π ・・・ Gb ≧ -1/π ・・・ H-1/π ≦ b ≦ 1/π ・・・ I ,,x = ( x1-x0 )*c + x0 + ( x1- x0 )*b*sin( πc ) 但し、0 ≦ c ≦ 1 , -1/π ≦ b ≦ 1/π∴ x = ( x1-x0 )*( c + b*sin( πc ) ) + x0 ・・・ J
var x0 = 50 ; // 始点のX座標
var x1 = 500 ; // 終点のX座標
var tmpCount = 0 ; // カウント
var divCount = 20 ; // 分割数
var edging = 100 ; // イージング値 -100 <= edging <= 100
function move(){
if( tmpCount++ < divCount ){
var c = tmpCount/divCount ;
var x = ( x1-x0 )*( c + edging/(100*Math.PI)*Math.sin( Math.PI*c ) ) + x0 ;
layer.setPositionX( x );
setTimeout( "move();" , 10 );
}
}
// このプログラムの実例 はこちら var x0 = 50 ; // 始点のX座標 var x1 = 500 ; // 終点のX座標 var y0 = 50 ; // 始点のY座標 var y1 = 300 ; // 終点のY座標 var tmpCount = 0 ; // カウント var divCount = 20 ; // 分割数 var edging = 100 ; // イージング値 -100 <= edging <= 100 function move(){ if( tmpCount++ < divCount ){ var c = tmpCount/divCount ; var x = ( x1-x0 )*( c + edging/(100*Math.PI)*Math.sin( Math.PI*c ) ) + x0 ; var y = ( y1-y0 )*( c + edging/(100*Math.PI)*Math.sin( Math.PI*c ) ) + y0 ; layer.setPosition( x , y ); setTimeout( "move();" , 10 ); } }
∫[0,1]xdc = [ ( x1-x0 )*( (1/2)c^2 - (b/π)*cos(πc) ) + x0*c ]= { ( x1-x0 )( 1/2 + b/π ) + x0 }-{ ( x1-x0 )( -b/π ) }= ( x0+x1 )/2 + ( 2/π )*( x1-x0 )*bb = ±1/π ,,// このプログラムの実例 はこちら var s = new Dimension( 50 , 50 ); // 始点の座標 var e = new Dimension( 500 , 300 ); // 始点の座標 var tmpCount = 0 ; // カウント var divCount = 20 ; // 分割数 var edging = 100 ; // イージング値 -100 <= edging <= 100 edging /= 100*Math.PI ; function move(){ if( tmpCount++ < divCount ){ var c = tmpCount/divCount ; var p = new Dimension( e ); p.sub( s ); p.scale( c + edging*Math.sin( Math.PI*c ) ); p.add( s ); layer.setPosition( p ); setTimeout( "move();" , 10 ); } }