山本ワールド
SVGによるマンデルブロ描画サンプル
描画
          SVGを使用してマンデルブロを描画してみました。
Canvasで点を描画する場合とSVGで点を描画する場合の比較のために作成したもので実用性はない。
Canvasを使用してマンデルブロを描画してみました。 下図は、複素座標(-1.33,-1)-(1.33,1)の範囲を320*240ピクセルの大きさで最大反復回数64回でJavascriptにより描画しています。 素のSVGには点を描画する関数が無いので1ピクセルの大きさの四角形で代用しています。 320*240ピクセルの点を1ピクセルの大きさの長方形で表現しているので、約77万個のrectエレメントが作成される。
IE11(64bit)で使用メモリーを見たところ82,796kbyteも消費していた。Canvasの場合36,504kbyteである。
右クリックでSVG形式で保存すると6Mbyte近くになる。
24bitカラーで無圧縮の場合320*240*3byte=225kbyteであり、png形式で保存すると約17kbyteとなる。
IEの場合、Canvasに比べて10倍ほどの速度差が発生する。
SVGで描画しているが、点で描画しているので拡大するとCanvasと同じようにギザギザに見える。
          
          
          
            
              
        
        
        Canvasで点を描画する場合とSVGで点を描画する場合の比較のために作成したもので実用性はない。
Canvasを使用してマンデルブロを描画してみました。 下図は、複素座標(-1.33,-1)-(1.33,1)の範囲を320*240ピクセルの大きさで最大反復回数64回でJavascriptにより描画しています。 素のSVGには点を描画する関数が無いので1ピクセルの大きさの四角形で代用しています。 320*240ピクセルの点を1ピクセルの大きさの長方形で表現しているので、約77万個のrectエレメントが作成される。
IE11(64bit)で使用メモリーを見たところ82,796kbyteも消費していた。Canvasの場合36,504kbyteである。
右クリックでSVG形式で保存すると6Mbyte近くになる。
24bitカラーで無圧縮の場合320*240*3byte=225kbyteであり、png形式で保存すると約17kbyteとなる。
IEの場合、Canvasに比べて10倍ほどの速度差が発生する。
SVGで描画しているが、点で描画しているので拡大するとCanvasと同じようにギザギザに見える。
| CPU | Windows | ブラウザ | 実行速度 | 
|---|---|---|---|
| Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz | Windows 10 | Edge 44.17763.1.0(64bit) | 994ms | 
| Intel(R) Core(TM) i5-4300U CPU @ 1.90GHz | Windows 8.1 | InternetExplorer 11 11.0.9600.19236 | 2827ms | 
| Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz | Windows 10 | IE | 1365ms | 
| Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz | Windows 10 | Edge | 1057ms | 
| Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz | Windows 10 | Chrome 62.0.3202.94(64bit) | 647ms | 
| Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz | Windows 10 | Edge | 1029ms | 
| Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz | Windows 10 | IE | 1414ms | 
| Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz | Windows 10 | Chrome | 563ms | 
| Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz | Windows 10 | Firefox | 293ms | 
| Intel(R) Core(TM) i7-3820 CPU @ 3.60GHz(OC4.2GHz) | Windows 7 | InternetExplorer 11 11.0.9600.18638 | 3781ms | 
| Intel(R) Celeron(R) CPU G3900 @ 2.80GHz | Windows 10 | Edge 25.10586.0.0(64bit) | 310ms | 
| Intel(R) Celeron(R) CPU G3900 @ 2.80GHz | Windows 10 | Chrome 58.0.3029.96(64bit) | 70ms | 
| Intel(R) Celeron(R) CPU G3900 @ 2.80GHz | Windows 10 | Firefox 53.0(32bit) | 162ms | 
ソースコード
          本ページからSVGによるマンデルブロ描画にかかわる部分のみを抽出したhtmlのソースコードを以下に示します。
htmlのソースコードは本ページの最後のリンクよりダウンロードすることができます。
        
        
        
      htmlのソースコードは本ページの最後のリンクよりダウンロードすることができます。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta charset="utf-8"/>
  <title>SVGによるマンデルブロ描画サンプル</title>
</head>
<body>
  <svg id="s1" width="320" height="240"  viewBox="0 0 320 240" xmlns="http://www.w3.org/2000/svg">
  </svg>
<script type="text/javascript">
// マンデルブロ描画
function mandelbrot(svg,wx,wy,amin,bmin,amax,bmax){
  var a,b,c;
  var sx,sy;
  sy=wy-1;
  for(b=bmin;b<bmax;){
    sx=0;
    for(a=amin;a<amax;){
      var x=0;
      var y=0;
      for(c=0;c<64;c++){
        var x2=x*x;
        var y2=y*y;
        var zx=x2-y2-a;
        var zy=2*x*y-b;
        x=zx;
        y=zy;
        if(4<=x2+y2)
          break;
      }
      var r1=(c & 0x3)<<6;
      var g1=(c & 0xc)<<4;
      var b1=(c & 0x30)<<2;
      var rect1=document.createElementNS('http://www.w3.org/2000/svg','rect');
      rect1.setAttribute('x',sx);
      rect1.setAttribute('y',sy);
      rect1.setAttribute('width',1);
      rect1.setAttribute('height',1);
      rect1.setAttribute('stroke','none');
      rect1.setAttribute('fill','rgb(' +r1+','+g1+','+b1+ ')' );
      svg.appendChild(rect1);
      a+=(amax-amin)/wx;
      ++sx;
    }
    b+=(bmax-bmin)/wy;
    --sy;
  }
}
window.onload = function(){
// ページ読み込み時に実行したい処理
  var start_code=new Date();
  var svg1=document.getElementById('s1');
    mandelbrot(svg1,320,240,-1.33,-1,1.33,1);
  var run_code=new Date()-start_code;   //      実行時間ms単位
  document.getElementById("run_time").innerHTML="実行時間 "+run_code+"ms";
}
</script>
</body>
</html>
      Copyright (C) 2012 山本ワールド All Rights Reserved.
    
    
  