canvasでグラデーションしてみる

とりあえず現時点でできてるもの。
Core2Duo2.4GHz メモリ2GBのMacBook上のFirefox3で6秒弱

<html>
<body>
<canvas id="color" width="350" height="350"></canvas>
<script type="text/javascript">
var canvas = document.getElementById('color');
var ctx = canvas.getContext('2d');

var canvas_w = canvas.width;
var canvas_h = canvas.height;
ctx.fillStyle = 'rgb(0,0,0)';
ctx.fillRect(0,0,canvas_w,canvas_h);

var floor = Math.floor;
var pow = Math.pow;
var cos = Math.cos;
var atan2 = Math.atan2;
var black = [0,0,0];
var pi =- Math.PI;
var pi2 = Math.PI * 2;
var pi2_3 = Math.PI * 2 / 3;
var pi_2 = Math.PI/2;
var pi_3 = Math.PI/3

var mid = [canvas_w/2,canvas_h/2]

var w,h;
w = h = 1;
var r = pow((canvas_w-9)/2,2);

var radian;
for(var j=0;j<canvas_h;j+=h){
  for(var i=0;i<canvas_w;i+=w){
    var d2 = pow(i-mid[0],2) + pow(j-mid[1],2);
    if(r < d2){continue;}
    radian = (atan2(-j+mid[1],-i+mid[0]) - pi_2);
    radian = (radian < 0) ? pi2 + radian : radian; 
    rgb = [
      cos(radian) + 0.5,
      cos(radian - pi2_3) + 0.5,
      cos(radian + pi2_3) + 0.5
    ];
    for(var t =0;t<3;t++){
      rgb[t] = (rgb[t] < 0) ? 0 : rgb[t];
      rgb[t] = (1 < rgb[t]) ? 1 : rgb[t];
      rgb[t] = 255 *  rgb[t];
      rgb[t] = parseInt(rgb[t]);
    }
    ctx.fillStyle = 'rgb('+rgb[0]+','+rgb[1]+','+rgb[2]+')';
    ctx.fillRect(i,j,w,h);
  }
}


</script>

</body>
</html>

あとで、canvasに実装されてるグラデーション用のメソッドも使ってみるw