SVG+JavaScript な組み合わせでアニメーション on Firefox

まあ表題の通り。
http://konbu.s13.xrea.com/lib/js/furiko_anim.svg
ちなみにこの動きはバネっぽい振り子の運動のシミュレーションみたいなそんなかんじ。Firefox1.5以降用。
無限ループの中で

  setTimeout(function(){hogehoge...}, time_quantum);

とかやって、hogehoge 部分で SVG 要素をいじる操作すればアニメーションになるよねー、というかんじ。

以下リンク先の SVG画像のコード。

<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width="600" height="600" viewBox="0 0 600 600">
<title>振り子の運動</title>
<!-- まとめて Translate 単なる表示の調節 -->
<g id="canvas" transform="translate(300,100)">
<g id="furiko">
<path id="sasae" d="M0,0 l0,0" stroke="black" />
<circle id="omori" cx="0" cy="0" r="20" stroke="black" fill="none" />
<script type="text/ecmascript">
<![CDATA[
var Pi = 3.141592653589793;
var G = 9.8;
var L = 100*G/4;
var funcs = [
	function(t, vec){
		return vec[1];
	},
	function(t, vec){
		return -(1/(L+vec[2]))*(G*Math.sin(vec[0])+2*vec[1]*vec[3]);
	},
	function(t, vec){
		return vec[3];
	},
	function(t, vec){
		return ((L+vec[2]))*Math.pow(vec[1],2)+G*Math.cos(vec[0])-2*vec[2];
  	}
];
function evalFuncs(time, funcs, vec){
  var newvec = new Array();
  for(var i=0;i<funcs.length;++i){
    newvec[i] = funcs[i](time, vec);
  }
  return newvec;
}
function addVector(v1, v2){
  var newvec = new Array();
  for(var i=0;i<v1.length;++i){
    newvec[i] = v1[i] + v2[i];
  }
  return newvec;
}
function mulVector(cval, vec){
  var newvec = new Array();
  for(var i=0;i<vec.length;++i){
    newvec[i] = cval*vec[i];
  }
  return newvec;
}
function printData(t, vec){
  var theta = vec[0];
  var xi = vec[2];
  var x = (L+xi)*Math.sin(theta);
  var y = (L+xi)*Math.cos(theta);
  theta = -theta*180/Pi;
  document.getElementById("sasae").setAttribute("d", "M0,0 L"+x+","+y);
  document.getElementById("omori").setAttribute("cx", x);
  document.getElementById("omori").setAttribute("cy", y);
}
var vector = [
  Pi/(2*(311048%3+1)),
  0.0,
  L/2,
  0.0,
];
var t_h = 0.1;
function step(time, funcs, vec){
  var k1, k2, k3, k4;
  k1 = evalFuncs(time, funcs, vec);
  k2 = evalFuncs(time+t_h/2, funcs, addVector(vec, mulVector(t_h/2, k1)));
  k3 = evalFuncs(time+t_h/2, funcs, addVector(vec, mulVector(t_h/2, k2)));
  k4 = evalFuncs(time+t_h, funcs, addVector(vec, mulVector(t_h, k3)));
  vec = addVector(vec, mulVector(t_h/6, k1));
  vec = addVector(vec, mulVector(t_h/3, k2));
  vec = addVector(vec, mulVector(t_h/3, k3));
  vec = addVector(vec, mulVector(t_h/6, k4));

  printData(time, vec);
  setTimeout(function(){step(time+t_h,funcs,vec)}, 60);
}
step(0.0, funcs, vector);

]]>
</script>
</g>
</g>

</svg>

test