山本ワールド
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>
ソースファイルのダウンロード(mandelbrot3.zip)
Copyright (C) 2012 山本ワールド All Rights Reserved.