JavaScriptでHTMLキャンバスにヒルベルト曲線を描くプログラムです.
このプログラムのキモはこちら.中央大学国際情報学部の1年生向け科目「プログラミングのための数学」で解説しています.

より詳しく知りたい方は「飯尾淳,連載:バーティカルバーの極意,シェルスクリプトマガジン vol.65, pp. 74-78, 2020年3月25日」で解説しているので,そちらをご参照ください(雑誌で解説しているバージョンは,誌面の関係からアニメーションしません).
const MAX_COUNT = 8;
// the canvas and its graphic context
var cs = document.getElementById('theCanvas');
var ctx = cs.getContext('2d');
// line style
var colors = [ 'gray', 'navy', 'purple', 'brown',
'red', 'orange', 'yellowgreen', 'skyblue' ];
var widths = [5, 4, 3, 2, 2, 1, 1, 0.5 ];
var tm = [
[ [ 0, 1/2, 0], [ 1/2, 0, 0], [0, 0, 1] ],
[ [1/2, 0, 0], [ 0, 1/2, 1/2], [0, 0, 1] ],
[ [1/2, 0, 1/2], [ 0, 1/2, 1/2], [0, 0, 1] ],
[ [ 0, -1/2, 1], [-1/2, 0, 1/2], [0, 0, 1] ]
]
var E = [ [ 1, 0, 0], [0, 1, 0], [0, 0, 1] ];
function affine_transform(m, p) {
return [ m[0][0] * p[0] + m[0][1] * p[1] + m[0][2],
m[1][0] * p[0] + m[1][1] * p[1] + m[1][2] ];
}
function mat_mul(m0, m1) {
return [ [m0[0][0]*m1[0][0]+m0[0][1]*m1[1][0]+m0[0][2]*m1[2][0],
m0[0][0]*m1[0][1]+m0[0][1]*m1[1][1]+m0[0][2]*m1[2][1],
m0[0][0]*m1[0][2]+m0[0][1]*m1[1][2]+m0[0][2]*m1[2][2]],
[m0[1][0]*m1[0][0]+m0[1][1]*m1[1][0]+m0[1][2]*m1[2][0],
m0[1][0]*m1[0][1]+m0[1][1]*m1[1][1]+m0[1][2]*m1[2][1],
m0[1][0]*m1[0][2]+m0[1][1]*m1[1][2]+m0[1][2]*m1[2][2]],
[m0[2][0]*m1[0][0]+m0[2][1]*m1[1][0]+m0[2][2]*m1[2][0],
m0[2][0]*m1[0][1]+m0[2][1]*m1[1][1]+m0[2][2]*m1[2][1],
m0[2][0]*m1[0][2]+m0[2][1]*m1[1][2]+m0[2][2]*m1[2][2]] ];
}
function hilbert(n, m) {
if (n > 0) {
tm.forEach(mm => hilbert(n-1, mat_mul(m, mm)));
} else {
[ [0.25, 0.25], [0.25, 0.75], [0.75, 0.75], [0.75, 0.25] ]
.map(p => affine_transform(m, p))
.map(p => [p[0]*cs.width, p[1]*cs.height])
.forEach(p => ctx.lineTo(p[0],p[1]));
}
}
function drawHilbert(i) {
ctx.beginPath();
ctx.lineWidth = widths[i];
ctx.strokeStyle = colors[i];
hilbert(i, E);
ctx.stroke();
}
function doLoop(maxCount, i) {
if (i < maxCount) {
drawHilbert(i);
setTimeout(function() {
doLoop(maxCount, ++i) }, 1500);
} else {
ctx.clearRect(0, 0, cs.width, cs.height);
doLoop(MAX_COUNT, 0);
}
}
doLoop(MAX_COUNT, 0);
var colors = [ 'gray', 'navy', 'purple', 'brown', 'red', 'orange', 'yellowgreen', 'skyblue' ];
返信削除var widths = [5, 4, 3, 2, 2, 1, 1, 0.5 ];
の部分は,本当は var colors_and_width = [ ['gray', 5], ['navy', 4], ...
という定義にしたほうが望ましい