球面上にN個の点を均等に配置したい。その3
理論は未だ不明なのだが、ryamada22 さんからの助言を頂いた方法で試してみた。
こちらの方が均等な感じがする
もちろんコードはやっつけで書いたので、後で清書する。
<!DOCTYPE html> <meta charset="UTF-8"> <title>test</title> <style> body, canvas { background : black; } </style> <body> <h1>Test </h1> <canvas width="1024" height="1024"></canvas> <script> var canvas = document.querySelector ('canvas'); var ctx = canvas.getContext('2d'); var x = 512; var y = 512; var n = 100; var r = 300; var w = +canvas.width; var h = +canvas.height; var DEG = Math.PI / 180; var K = 0; var L = 0; var z = 2; var s = 200; function fib (n) { var a = 0, b = 1, c = 2, r = [a, b], s; while (--n) { s = r[c++] = a + b; a = b; b = s; } return r; } function B (n, FN) { var fn = FN[n] / 2; var f1 = (Math.sqrt (5) + 1) / 2; var k = 1; var f2 = f1 - 1; var P = 2 * n + 1; var i, T, phi; var rst = []; var x, y, z; for (i = -n; i <= n; i += k) { T = Math.asin (2 * i / (2 * n + 1)); z = Math.sin (T); phi = 2 * Math.PI * i * f2; x = Math.cos (T) * Math.cos (phi); y = Math.cos (T) * Math.sin (phi); rst.push ([x, y, z]); } return rst; } function draw () { ctx.fillStyle = 'RGBA(0,0,0,.25)'; ctx.fillRect (0,0, w,h); for (var i = 0; i < a.length; i++) { var px = a[i][0]; var py = a[i][1]; var pz = a[i][2]; var deg0 = K * DEG; var deg1 = L * DEG; var sin = Math.sin (deg0); var cos = Math.cos (deg0); var sin2 = Math.sin (deg1); var cos2 = Math.cos (deg1); var tx = px * cos + pz * sin; var ty = py; var tz = px * sin - pz * cos; px = tx * cos2 + ty * sin2; py = tx * sin2 - ty * cos2; pz = tz; pz = z + pz; var zz = pz / z; px = px * zz py = py * zz; ctx.fillStyle = '#c40'; ctx.fillRect (x + px * s, y - py * s, 5 * zz, 5 * zz); } K += 1.5; L += 0.1; } var FN = fib (n); var a = B (n, FN); setInterval (draw, 33); </script>