Got the vertices of the 120-cell looking ok
parent
32a01e6bfd
commit
c986b7cbfb
5
main.js
5
main.js
|
@ -157,6 +157,7 @@ const STRUCTURES = {
|
||||||
'16-cell': POLYTOPES.cell16(),
|
'16-cell': POLYTOPES.cell16(),
|
||||||
'tesseract': POLYTOPES.tesseract(),
|
'tesseract': POLYTOPES.tesseract(),
|
||||||
'24-cell': POLYTOPES.cell24(),
|
'24-cell': POLYTOPES.cell24(),
|
||||||
|
'120-cell': POLYTOPES.cell120()
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log(STRUCTURES);
|
console.log(STRUCTURES);
|
||||||
|
@ -167,7 +168,7 @@ function createShape(name) {
|
||||||
if( shape ) {
|
if( shape ) {
|
||||||
scene.remove(shape);
|
scene.remove(shape);
|
||||||
}
|
}
|
||||||
|
console.log(STRUCTURES[name]);
|
||||||
shape = new FourDShape(node_ms, link_ms, STRUCTURES[name]);
|
shape = new FourDShape(node_ms, link_ms, STRUCTURES[name]);
|
||||||
scene.add(shape);
|
scene.add(shape);
|
||||||
|
|
||||||
|
@ -219,7 +220,7 @@ const gui_params = {
|
||||||
};
|
};
|
||||||
|
|
||||||
gui.add(gui_params, 'shape',
|
gui.add(gui_params, 'shape',
|
||||||
[ '5-cell', '16-cell', 'tesseract', '24-cell' ]
|
[ '5-cell', '16-cell', 'tesseract', '24-cell', '120-cell' ]
|
||||||
).onChange(createShape)
|
).onChange(createShape)
|
||||||
|
|
||||||
gui.add(gui_params, 'hyperplane', 1.5, 4);
|
gui.add(gui_params, 'hyperplane', 1.5, 4);
|
||||||
|
|
50
permute.js
50
permute.js
|
@ -28,15 +28,32 @@ function pandita(a) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function permutations_old(a) {
|
||||||
|
a.sort();
|
||||||
|
const ps = [ [...a] ];
|
||||||
|
let running = true;
|
||||||
|
while( running ) {
|
||||||
|
const s = pandita(a);
|
||||||
|
if( s ) {
|
||||||
|
ps.push([...a]);
|
||||||
|
} else {
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ps;
|
||||||
|
}
|
||||||
|
|
||||||
function permutations(a) {
|
function permutations(a) {
|
||||||
a.sort();
|
a.sort();
|
||||||
const ps = [ [...a] ];
|
const ps = [ [...a] ];
|
||||||
while( pandita(a) ) {
|
let running = true;
|
||||||
|
while( pandita(a) > 0 ) {
|
||||||
ps.push([...a]);
|
ps.push([...a]);
|
||||||
}
|
}
|
||||||
return ps;
|
return ps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function permutations_even(a) {
|
function permutations_even(a) {
|
||||||
a.sort();
|
a.sort();
|
||||||
let parity = 'even';
|
let parity = 'even';
|
||||||
|
@ -64,4 +81,35 @@ function permutations_even(a) {
|
||||||
return ps;
|
return ps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// for a given permutation, say [ 1, 1, 0, 0 ], return all
|
||||||
|
// of the valid changes of sign, so:
|
||||||
|
// [ [1, 1, 0, 0 ], [ -1, 1, 0, 0 ], [ 1, -1, 0, 0 ], [-1, -1, 0, 0 ]]
|
||||||
|
// ie don't do it on the zeros
|
||||||
|
|
||||||
|
function expand_sign(a) {
|
||||||
|
const expanded = [];
|
||||||
|
const exv = a.map((v) => v ? [ -v, v ] : [ 0 ]);
|
||||||
|
for( const xv of exv[0] ) {
|
||||||
|
for( const yv of exv[1] ) {
|
||||||
|
for( const zv of exv[2] ) {
|
||||||
|
for( const wv of exv[3] ) {
|
||||||
|
expanded.push({x: xv, y:yv, z:zv, w:wv});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return expanded;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function coordinates(a, even=false) {
|
||||||
|
const ps = even ? permutations_even(a) : permutations(a);
|
||||||
|
const coords = [];
|
||||||
|
for( const p of ps ) {
|
||||||
|
const expanded = expand_sign(p);
|
||||||
|
coords.push(...expanded);
|
||||||
|
}
|
||||||
|
return coords;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
38
polytopes.js
38
polytopes.js
|
@ -1,4 +1,5 @@
|
||||||
|
|
||||||
|
import * as PERMUTE from './permute.js';
|
||||||
|
|
||||||
export const cell5 = () => {
|
export const cell5 = () => {
|
||||||
const r5 = Math.sqrt(5);
|
const r5 = Math.sqrt(5);
|
||||||
|
@ -229,3 +230,40 @@ export const cell24 = () => {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function make_120cell_vertices() {
|
||||||
|
const phi = 0.5 * (1 + Math.sqrt(5)); 3
|
||||||
|
const r5 = Math.sqrt(5); 5
|
||||||
|
const phi2 = phi * phi; 4
|
||||||
|
const phiinv = 1 / phi; 6
|
||||||
|
const phi2inv = 1 / phi2; 7
|
||||||
|
|
||||||
|
const nodes = [
|
||||||
|
PERMUTE.coordinates([2, 2, 0, 0]),
|
||||||
|
PERMUTE.coordinates([r5, 1, 1, 1]),
|
||||||
|
PERMUTE.coordinates([phi, phi, phi, phi2inv]),
|
||||||
|
PERMUTE.coordinates([phi, phiinv, phiinv, phiinv]),
|
||||||
|
|
||||||
|
PERMUTE.coordinates([phi2, phi2inv, 1, 0], true),
|
||||||
|
PERMUTE.coordinates([r5, phiinv, phi, 0], true),
|
||||||
|
PERMUTE.coordinates([2, 1, phi, phiinv], true),
|
||||||
|
].flat();
|
||||||
|
let i = 1;
|
||||||
|
for( const n of nodes ) {
|
||||||
|
n["id"] = i;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return nodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export const cell120 = () => {
|
||||||
|
const nodes = make_120cell_vertices();
|
||||||
|
|
||||||
|
return {
|
||||||
|
nodes: nodes,
|
||||||
|
links: []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue