球面上にN個の点を均等に配置したい。
http://d.hatena.ne.jp/ryamada22/20080831
凄いなぁ〜、さっぱりわからない。OTL
これを Javascript に移植したい。
やりたいこと、N個の画像を球体上に配置して、ぐるぐる回したい。
ダメだ〜もう眠い。続きはまた暇な時
<!DOCTYPE html> <meta charset="UTF-8"> <title>test</title> <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 = 8; var r = 400; var w = +canvas.width; var h = +canvas.height; var DEG = Math.PI / 180; function pset (x, y, c, r) { this.fillStyle = c || '#000'; this.fillRect ((x |0) + 0.5, (y |0) +0.5, r || 1, r || 1); } var a = A (1000, 300); var z = 2000; var s = 2; var K = 0; var L = 0; function draw () { ctx.fillStyle = "#fff"; 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 sin = Math.sin (K * Math.PI / 180); var cos = Math.cos (K * Math.PI / 180); var sin2 = Math.sin (L * Math.PI / 180); var cos2 = Math.cos (L * Math.PI / 180); 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; pset.call (ctx, x + px, y - py, 'red', 2); } K += 1; L += 2; } setInterval (draw, 50); var mouseMoveChecker = { handleEvent : function (evt) { var rect = evt.target.getBoundingClientRect (); mouseX = evt.clientX - rect.left; mouseY = evt.clientY - rect.top; document.title = (w/2 - mouseX|0) + '/' + (h/2 -mouseY|0) + '/'+(rect.left); } }; document.addEventListener ('mousemove', mouseMoveChecker, false); function A (N_, R_) { var PI = Math.PI; var INT = Math.floor; var SIN = Math.sin; var COS = Math.cos; var ABS = Math.abs; var SQRT = Math.sqrt; var PI2 = PI + PI; var N = N_; var T = 4 / SQRT (N); var n = INT (2 * PI / T); var neq = INT (n / 2); var IDO = new Array (n); var KDO = new Array (n); var RST = []; var i, I, j, J; var i2, i3; IDO[ 0 ] = [0]; KDO[ 0 ] = [0]; IDO[ neq ] = new Array (n); KDO[ neq ] = new Array (n); for (i = 0; i < n; i++) { IDO[ neq ][ i ] = 0; KDO[ neq ][ i ] = i * T; } for (i = neq + 1; i < n; i++) { i2 = i - neq; i3 = neq - i2; n2 = INT (PI2 * ABS (COS (T * i2)) / T); IDO[ i ] = new Array (n2); KDO[ i ] = new Array (n2); if (0 <= i3) { IDO[ i3 ] = new Array (n2); KDO[ i3 ] = new Array (n2); } for (j = 0; j < n2; j++) { IDO[i][j] = KDO[neq][i2]; KDO[i][j] = j * PI2 / n2; if (0 <= i3) { IDO[ i3 ][j] = -KDO[ neq ][ i3 ]; KDO[ i3 ][j] = j * PI2 / n2; } } } function r2xyz (r1, r2, r3) { var cr1 = COS (r1); return [ cr1 * COS (r2) * r3, cr1 * SIN (r2) * r3, SIN (r1) * r3 ]; } for (i = 0, I = IDO.length; i < I; i++) { for (j = 0, J = IDO[i].length; j < J; j++) { RST.push (r2xyz (IDO[i][j], KDO[i][j], R_)); } } return RST; } </script>