orbit2 = {
const grcopy = function grcopy([x0=0, x1=0, xd=1]=[]) {
return [x0, x1, xd]; }
const lt0_abs = function lt0_abs(a) {
const float = a[0] + PHI * a[1], sign = ((float>0)-(float<0));
a[0] *= sign; a[1] *= sign;
return +(sign < 0); }
const hamming_parity = function hamming_parity(n) {
n -= (n >> 1) & 0x55; n -= (n >> 2) & 0x33;
return (n - (n >> 4)) & 0x01; }
const orbit_quaternions = [...range(0x100)].map(rb => {
let quat = [[1],,,];
if (rb & 0x80) quat = quatmul(quat, [,[1],,]);
if (rb & 0x40) quat = quatmul(quat, [,,[1],]);
if (rb & 0x20) quat = quatmul(quat, [,,,[1]]);
quat = quatmul(quat, [[,1,2],[-1,,2],[1,-1,2],]);
if (rb & 0x10) quat = quatmul(quat, [,,[1],]);
if (rb & 0x08) quat = quatmul(quat, [,,,[1]]);
quat = quatmul(quat, [[,1,2],[-1,,2],[1,-1,2],]);
if (rb & 0x04) quat = quatmul(quat, [,,[1],]);
if (rb & 0x02) quat = quatmul(quat, [,,,[1]]);
if (rb & 0x01) quat = quatmul(quat, [,[-1,1,2],[-1,,2],[,-1,2]]);
const sign = quat.map(grsign).reduce((a, b) => a || b) || 1;
return scalarmul([sign], quat);
});
const v = [[-1, 1], [-1], [, -1]];
return function orbit2(u) {
u = [grcopy(u[0]), grcopy(u[1]), grcopy(u[2])];
const rbits = [lt0_abs(u[0]), lt0_abs(u[1]), lt0_abs(u[2])];
u = transform(red_rotation, u); rbits.push(lt0_abs(u[1]), lt0_abs(u[2]));
u = transform(red_rotation, u); rbits.push(lt0_abs(u[1]), lt0_abs(u[2]));
let d = dot(u, v), ds = +grgreater([0], d); rbits.push(ds);
d = grmul([-ds, 0, 2], d); u = vectoradd(u, scalarmul(d, v));
const orb = scalarmul(grinv(u[0]), [u[1], u[2]]);
const rbits_int = rbits.reduce((a, b) => (a << 1) + b);
const rotation = orbit_quaternions[rbits_int];
const length = u[0];
const reflected = hamming_parity(rbits_int);
return [orb, rotation, reflected, length];
}
}