JavaScript
var A = 0.44;
var n = 3;
var uSteps = 149,
vSteps = 149;
var pi = Math.PI;
var scale = 0.03;
var phi = (1 + Math.sqrt(5)) / 2;
var a = 1 / Math.sqrt(3);
var b = a / phi;
var c = a * phi;
var points = [
[a, a, a],
[a, a, -a],
[a, -a, a],
[-a, -a, a],
[-a, a, -a],
[-a, a, a],
[0, b, -c],
[0, -b, -c],
[0, -b, c],
[c, 0, -b],
[-c, 0, -b],
[-c, 0, b],
[b, c, 0],
[b, -c, 0],
[-b, -c, 0],
[-b, c, 0],
[0, b, c],
[a, -a, -a],
[c, 0, b],
[-a, -a, -a]
];
function reorient(axis1, axis2) {
var vX1 = axis1.normalize();
var vX2 = axis2.normalize();
var vY = vX1.clone().cross(vX2).normalize();
var vZ1 = vX1.clone().cross(vY).normalize();
var vZ2 = vX2.clone().cross(vY).normalize();
var M1array = [vX1.x, vX1.y, vX1.z, vY.x, vY.y, vY.z, vZ1.x, vZ1.y, vZ1.z];
var M1 = new THREE.Matrix3();
M1.fromArray(M1array);
var M2array = [vX2.x, vY.x, vZ2.x, vX2.y, vY.y, vZ2.y, vX2.z, vY.z, vZ2.z];
var M2 = new THREE.Matrix3();
M2.fromArray(M2array);
var M = M1.clone().multiply(M2);
var elems = M.elements;
var A = new THREE.Matrix4();
A.set(elems[0], elems[1], elems[2], axis2.x,
elems[3], elems[4], elems[5], axis2.y,
elems[6], elems[7], elems[8], axis2.z,
0, 0, 0, 1);
return A;
}
function getRotation(U, V) {
var ma = U.length();
var mb = V.length(); // should be = ma
var d = U.x * V.x + U.y * V.y + U.z * V.z;
var c = Math.sqrt(ma * mb + d);
var ma2 = Math.sqrt(2) * ma;
var r = 1 / ma2 / c;
var W = U.clone().cross(V).multiplyScalar(r);
var quat = new THREE.Quaternion().set(W.x, W.y, W.z, c / ma2);
return new THREE.Matrix4().makeRotationFromQuaternion(quat);
}
// parameterization -------------------------------------------------
function f0(u, v, A, n) {
// both u and v run from zero to one in Three.js
var t = n * 2 * pi * u;
var phi = 2 * pi * v;
var h = pi / 2 - (pi / 2 - A) * Math.cos(t);
var sinh = Math.sin(h);
var p2 = sinh * Math.cos(t / n + A * Math.sin(2 * t));
var p3 =...