球面上に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>