xxxxxxxxxx
121
let M;
let pts;
function m() {
// https://arxiv.org/pdf/2302.06230.pdf
const R1 = random(-1, 1);
const R2 = random(TWO_PI);
const R3 = random(TWO_PI);
const R4 = random(1);
const a1s = [sqrt(1 - sq(R1)) * cos(R2), sqrt(1 - sq(R1)) * sin(R2), R1];
const a2s = [
R1 * cos(R2) * cos(R3) + sin(R2) * sin(R3),
R1 * sin(R2) * cos(R3) - cos(R2) * sin(R3),
-sqrt(1 - sq(R1)) * cos(R3),
];
let s = sqrt(R4);
const a1 = [a1s[0] * s, a1s[1] * s, a1s[2] * s];
s = sqrt(1 - R4);
const a2 = [a2s[0] * s, a2s[1] * s, a2s[2] * s];
const alpha = random(0.001, 0.005);
const beta = random(0.001, 0.005);
const h12 = a2[0] * a2[1] - a1[0] * a1[1];
const h21 = h12;
const h13 = a2[0] * a2[2] - a1[0] * a1[2];
const h31 = h13;
const h23 = a2[1] * a2[2] - a1[1] * a1[2];
const h32 = h23;
const h14 = a1[2] * a2[1] - a1[1] * a2[2];
const h41 = h14;
const h24 = a1[0] * a2[2] - a1[2] * a2[0];
const h42 = h24;
const h34 = a1[1] * a2[0] - a1[0] * a2[1];
const h43 = h34;
const D = cos(alpha) - cos(beta);
return [
(sq(a1[1]) + sq(a1[2]) + sq(a2[0])) * D + cos(beta), // r11
h12 * D - a1[2] * sin(alpha) - a2[2] * sin(beta), // r12
h13 * D + a1[1] * sin(alpha) + a2[1] * sin(beta), // r13
h14 * D + a2[0] * sin(alpha) + a1[0] * sin(beta), // r14
h21 * D + a1[2] * sin(alpha) + a2[2] * sin(beta), // r21
cos(alpha) - (sq(a1[1]) + sq(a2[0]) + sq(a2[2])) * D, // r22
h23 * D - a1[0] * sin(alpha) - a2[0] * sin(beta), // r23
h24 * D + a2[1] * sin(alpha) + a1[1] * sin(beta), // r24
h31 * D - a1[1] * sin(alpha) - a2[1] * sin(beta), // r31
h32 * D + a1[0] * sin(alpha) + a2[0] * sin(beta), // r32
cos(alpha) - (sq(a1[2]) + sq(a2[0]) + sq(a2[1])) * D, // r33
h34 * D + a2[2] * sin(alpha) + a1[2] * sin(beta), // r34
h41 * D - a2[0] * sin(alpha) - a1[0] * sin(beta), // r41
h42 * D - a2[1] * sin(alpha) - a1[1] * sin(beta), // r42
h43 * D - a2[2] * sin(alpha) - a1[2] * sin(beta), // r43
(sq(a2[0]) + sq(a2[1]) + sq(a2[2])) * D + cos(beta), // r44
];
}
function makePoints() {
pts = [];
for (let ix = 0; ix < 10; ++ix) {
const x = map(ix, 0, 9, -1, 1);
for (let iy = 0; iy < 10; ++iy) {
const y = map(iy, 0, 9, -1, 1);
for (let iz = 0; iz < 10; ++iz) {
const z = map(iz, 0, 9, -1, 1);
for (let iw = 0; iw < 10; ++iw) {
const w = map(iw, 0, 9, -1, 1);
pts.push([x, y, z, w]);
}
}
}
}
}
function mul(T, p) {
return [
T[0] * p[0] + T[1] * p[1] + T[2] * p[2] + T[3] * p[3],
T[4] * p[0] + T[5] * p[1] + T[6] * p[2] + T[7] * p[3],
T[8] * p[0] + T[9] * p[1] + T[10] * p[2] + T[11] * p[3],
T[12] * p[0] + T[13] * p[1] + T[14] * p[2] + T[15] * p[3],
];
}
function setup() {
createCanvas(500, 500);
makePoints();
M = m();
}
function draw() {
background(40);
noStroke();
fill(255, 100);
for (let idx = 0; idx < pts.length; ++idx) {
pts[idx] = mul(M, pts[idx]);
const z = pts[idx][2];
const x = pts[idx][0] / (10 + z);
const y = pts[idx][1] / (10 + z);
circle(width / 2 + 1600 * x, height / 2 + 1600 * y, 50 / (10 + z));
}
}
function keyPressed() {
if (key === " ") {
M = m();
} else if (key === "g") {
makePoints();
saveGif("out.gif");
} else if (key === "s") {
save("jan16.png");
}
}