Building it up layer by layer

feature-120-cell-index
Mike Lynch 2023-09-01 17:34:27 +10:00
parent c093c89ce6
commit 26f927daae
4 changed files with 166 additions and 73 deletions

View File

@ -35,11 +35,18 @@ scene.background = new THREE.Color(0x808080);
const material = new THREE.MeshStandardMaterial({ color: 0x3293a9 }); const material = new THREE.MeshStandardMaterial({ color: 0x3293a9 });
const node_colours = get_colours(0x3293a9); const node_colours = get_colours(0x3293a9);
console.log(node_colours);
material.transparent = true; material.transparent = true;
material.opacity = 0.5; material.opacity = 0.5;
const node_ms = node_colours.map((c) => new THREE.MeshStandardMaterial({color: c})); const node_ms = node_colours.map((c) => new THREE.MeshStandardMaterial({color: c}));
node_ms[0].transparent = true;
node_ms[0].opacity = 0.0;
const link_ms = [ material ]; const link_ms = [ material ];

View File

@ -6,5 +6,6 @@
}, },
"devDependencies": { "devDependencies": {
"vite": "^4.4.6" "vite": "^4.4.6"
} },
"type": "module"
} }

View File

@ -386,40 +386,46 @@ function arctic_label_120cell(nodes) {
const ARCTIC_COLOURED = { const ARCTIC_COLOURED = {
'1': [ '1': [
49, 105, 131, 149, 165, 223, 27, 49, 61, 87, 95, 105, 131, 149, 165,
241, 253, 265, 279, 301, 313, 174, 185, 210, 223, 226, 239, 241, 253, 263,
325, 347, 367, 389, 413, 425, 265, 279, 285, 301, 311, 313, 325, 331, 347,
449, 453, 469, 473, 487, 513, 357, 367, 369, 383, 389, 393, 406, 413, 419,
581, 593 425, 438, 449, 453, 469, 471, 473, 487, 511,
513, 525, 530, 563, 566, 573, 581, 585, 593
], ],
'2': [ '2': [
1, 5, 7, 15, 19, 25, 35, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 23,
37, 41, 53, 69, 85, 93, 97, 24, 25, 31, 35, 37, 41, 50, 53, 57, 67, 69,
109, 113, 129, 135, 145, 155, 157, 73, 82, 83, 85, 91, 93, 97, 103, 109, 113, 119,
161, 167, 173, 177, 209 123, 125, 129, 135, 141, 145, 150, 155, 157, 161, 167,
170, 173, 177, 182, 189, 193, 199, 209, 214, 215
], ],
'3': [ '3': [
39, 45, 65, 117, 153, 219, 39, 45, 65, 86, 99, 117, 127, 137, 153,
245, 251, 269, 293, 317, 321, 178, 197, 211, 219, 230, 235, 245, 251, 257,
349, 375, 399, 417, 437, 441, 269, 273, 293, 312, 317, 321, 335, 343, 349,
445, 457, 485, 509, 515, 529, 355, 363, 375, 385, 399, 405, 415, 417, 437,
577, 597 441, 445, 457, 475, 485, 498, 502, 509, 515,
529, 547, 551, 562, 567, 569, 577, 589, 597
], ],
'4': [ '4': [
33, 101, 159, 169, 213, 221, 33, 54, 71, 77, 101, 115, 121, 146, 159,
229, 249, 271, 277, 329, 341, 169, 195, 213, 221, 229, 237, 242, 249, 261,
351, 361, 397, 409, 433, 461, 271, 277, 295, 309, 315, 322, 329, 341, 351,
477, 483, 517, 533, 545, 549, 359, 361, 371, 390, 397, 408, 409, 423, 433,
561, 583 443, 447, 461, 477, 483, 489, 493, 507, 517,
533, 545, 549, 553, 561, 575, 583, 595, 598
], ],
'5': [ '5': [
29, 81, 89, 133, 163, 181, 29, 81, 89, 133, 163, 181, 217, 225, 233,
217, 225, 255, 267, 303, 333, 246, 255, 259, 267, 275, 287, 294, 303, 310,
337, 345, 365, 373, 421, 429, 319, 326, 333, 337, 345, 353, 365, 373, 381,
465, 481, 497, 501, 505, 519, 391, 395, 407, 411, 421, 429, 434, 451, 455,
565, 579 465, 467, 479, 481, 497, 501, 505, 519, 521,
534, 537, 541, 557, 565, 571, 579, 594, 599
] ]
} };
for( const cstr in ARCTIC_COLOURED ) { for( const cstr in ARCTIC_COLOURED ) {
label_nodes(nodes, ARCTIC_COLOURED[cstr], Number(cstr)); label_nodes(nodes, ARCTIC_COLOURED[cstr], Number(cstr));
} }
@ -440,16 +446,16 @@ export const cell120 = () => {
const nodes = make_120cell_vertices(); const nodes = make_120cell_vertices();
const links = auto_detect_edges(nodes, 4); const links = auto_detect_edges(nodes, 4);
meridian_label_120cell(nodes); arctic_label_120cell(nodes);
// const links = links_all.filter((l) => { const links_f = links.filter((l) => {
// const labels = link_labels(nodes, l); const labels = link_labels(nodes, l);
// return ( labels[0] > 0 && labels[1] > 0 ); return ( labels[0] > 0 && labels[1] > 0 );
// }); });
return { return {
nodes: nodes, nodes: nodes,
links: links, links: links_f,
geometry: { geometry: {
node_size: 0.02, node_size: 0.02,
link_size: 0.02 link_size: 0.02

View File

@ -466,6 +466,19 @@ function find_adjacent_nodes(links, nid) {
}); });
} }
function node_by_id(nodes, nid) {
const ns = nodes.filter((n) => n.id === nid);
return ns[0];
}
function find_adjacent_labels(nodes, links, nid) {
return find_adjacent_nodes(links, nid).map(
(nid) => node_by_id(nodes, nid).label
);
}
function colour_next_dodeca_maybe(nodes, links, faces, colours, dd, nextf, nextdd) { function colour_next_dodeca_maybe(nodes, links, faces, colours, dd, nextf, nextdd) {
@ -575,6 +588,33 @@ function follow_meridian(nodes, links, faces, colours, odd, dir, max) {
} }
function follow_and_colour(nodes, links, faces, colours, dd, face) {
let nextdd = follow_face_to_dodeca(faces, dd, face);
let ncolours = colour_next_dodeca_maybe(nodes, links, faces, colours, dd, face, nextdd);
if( !ncolours ) {
nextdd = follow_face_to_dodeca(faces, dd, face, true);
ncolours = colour_next_dodeca_maybe(nodes, links, faces, colours, dd, face, nextdd);
if( !ncolours ) {
console.log("two mismatches");
}
}
return [ nextdd, ncolours ];
}
function add_colours(colours, ncolours) {
for( const vertex in ncolours ) {
if( vertex in colours ) {
if( colours[vertex] !== ncolours[vertex] ) {
console.log(`label mismatch at ${vertex}: ${colours[vertex]}/${ncolours[vertex]}`);
}
} else {
colours[vertex] = ncolours[vertex];
}
}
}
// "arctic circle" - this one works // "arctic circle" - this one works
@ -628,53 +668,70 @@ function arctic(nodes, links, faces, startf, startn, max) {
// this one breaks but I don't know if it's because of the traversal
// algorithm or the indexing algorithm
function whole_120_cell(nodes, links, faces, startf, startn, max) {
function arctic_two(nodes, links, faces, startf, startn) {
const pole = face_plus_to_dodecahedron(faces, startf, startn); const pole = face_plus_to_dodecahedron(faces, startf, startn);
const dds = [ pole ]; const dds = [ pole ];
const queue = [ pole ];
const seen = {}; const seen = {};
seen[dd_fingerprint(pole)] = true;
// colour first cell const colours = colour_dodecahedron_from_face(dds[0], [ 1, 2, 3, 4, 5 ] );
const vs = dodecahedron_vertices(dds[0]);
const colours = colour_dodecahedron_from_face(pole, [ 1, 2, 3, 4, 5 ] ); for( const face of pole ) {
const [ nextdd, ncolours ] = follow_and_colour(
nodes, links, faces, colours, pole, face
);
add_colours(colours, ncolours);
dds.push(nextdd);
seen[dd_fingerprint(nextdd)] = true;
}
let ncolours = {}; // dumb!
// top five of the temperate circle
while( ncolours && queue.length > 0 ) { const a1 = dds[1];
const dd = queue.shift(); for( const a of dds.slice(1, 12) ) {
for( const face of dd ) { for( const i of [ 6, 7, 8, 9, 10 ] ) {
let nextdd = follow_face_to_dodeca(faces, dd, face); const [ nextdd, ncolours ] = follow_and_colour(
nodes, links, faces, colours, a, a[i]
);
const fp = dd_fingerprint(nextdd); const fp = dd_fingerprint(nextdd);
if( !(fp in seen) ) { if( !(fp in seen) ) {
seen[fp] = true; add_colours(colours, ncolours);
ncolours = colour_next_dodeca_maybe(nodes, links, faces, colours, pole, face, nextdd);
if( !ncolours ) {
nextdd = follow_face_to_dodeca(faces, pole, face, true);
ncolours = colour_next_dodeca_maybe(nodes, links, faces, colours, pole, face, nextdd);
if( !ncolours ) {
console.log("two mismatches");
}
}
for( const vertex in ncolours ) {
if( vertex in colours ) {
if( colours[vertex] !== ncolours[vertex] ) {
console.log(`label mismatch at ${vertex}: ${colours[vertex]}/${ncolours[vertex]}`);
}
} else {
colours[vertex] = ncolours[vertex];
}
}
dds.push(nextdd); dds.push(nextdd);
queue.push(nextdd); seen[fp] = true;
} }
} }
} }
// // bottom five of the temperate circle
// const a12 = dds[12];
// for( const i of [ 6, 7, 8, 9, 10 ] ) {
// const [ nextdd, ncolours ] = follow_and_colour(
// nodes, links, faces, colours, a1, a1[i]
// );
// add_colours(colours, ncolours);
// dds.push(nextdd);
// }
// // will be weird
// for( const dd of dds.slice(2, 12) ) {
// const [ nextdd, ncolours ] = follow_and_colour(
// nodes, links, faces, colours, dd, dd[6]
// );
// add_colours(colours, ncolours);
// dds.push(nextdd);
// }
// for( const dd of dds.slice(2, 7) ) {
// const [ nextdd, ncolours ] = follow_and_colour(
// nodes, links, faces, colours, dd, dd[6]
// );
// add_colours(colours, ncolours);
// dds.push(nextdd);
// }
const labels = { 1: [], 2:[], 3:[], 4:[], 5:[] }; const labels = { 1: [], 2:[], 3:[], 4:[], 5:[] };
for( const vstr in colours ) { for( const vstr in colours ) {
@ -683,9 +740,6 @@ function whole_120_cell(nodes, links, faces, startf, startn, max) {
return { dodecahedra: dds, labels: labels }; return { dodecahedra: dds, labels: labels };
} }
@ -715,7 +769,7 @@ function face_to_dodecahedra(faces, f) {
function dd_fingerprint(dodecahedron) { function dd_fingerprint(dodecahedron) {
const ids = dodecahedron.map((face) => face.id); const ids = dodecahedron.map((face) => face.id);
ids.sort() ids.sort((a, b) => a - b);
return ids.join(','); return ids.join(',');
} }
@ -792,12 +846,37 @@ function dodeca_nodes(dd) {
} }
function label_nodes(nodes, ids, label) {
nodes.filter((n) => ids.includes(n.id)).map((n) => n.label = label);
}
function meridian_label_120cell(nodes) {
const MERIDIAN_COLOURED ={"1":[27,38,49,61,68,74,87,105,120,126,131,140,149,156,165,174,179,185,200,207,210,218,223,226,231,234,239,241,253,258,263,265,272,274,279,284,285,289,296,300,301,306,311,313,320,324,325,331,334,339,342,347,350,356,357,367,369,376,378,383,388,389,393,400,413,414,419,420,425,440,449,453,458,460,469,471,473,474,487,488,490,494,499,503,511,512,513,514,525,527,530,532,539,543,546,550,555,558,563,566,572,573,580,581,592,593],"2":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,21,22,23,24,25,28,30,31,34,35,37,40,41,46,47,50,51,53,56,57,60,62,63,66,67,69,72,73,76,78,83,85,88,90,93,97,103,106,107,109,112,113,116,118,119,122,123,125,129,132,134,135,138,139,141,144,145,148,150,151,155,157,160,161,164,166,167,170,171,173,177,180,182,183,187,189,192,193,196,198,202,203,205,208,209,212,214,215],"3":[26,39,45,52,64,65,94,99,108,117,127,130,137,152,153,168,175,178,188,197,206,211,219,222,227,230,235,238,245,251,268,269,273,280,283,286,292,293,299,302,305,312,316,317,321,328,330,335,349,355,358,363,366,370,375,377,384,385,392,394,399,404,405,415,416,417,418,426,437,439,441,445,452,456,457,459,470,472,475,485,486,491,495,498,502,509,510,515,516,526,529,531,538,542,547,551,554,559,562,567,569,576,577,584,588,597],"4":[32,33,43,54,58,71,77,84,101,110,115,121,136,143,146,159,162,169,184,204,213,220,221,228,229,236,237,249,260,261,271,276,277,281,288,290,295,297,304,308,309,315,318,322,327,329,336,340,341,351,354,359,361,368,371,374,379,382,387,390,396,397,409,410,423,424,430,433,435,443,447,450,454,461,463,466,468,477,478,483,484,489,493,500,504,507,508,517,518,522,533,535,540,544,545,549,553,560,561,568,570,583,587,590,595,598],"5":[29,36,42,55,59,70,80,81,89,111,114,133,142,147,163,181,191,194,201,216,217,224,225,232,233,240,243,246,255,267,270,275,278,282,287,291,294,298,303,307,310,314,319,323,326,332,333,337,344,345,352,353,360,364,365,372,373,380,381,395,398,402,407,411,412,421,422,429,436,442,446,451,455,462,464,465,467,479,481,482,492,496,497,501,505,506,519,520,521,523,534,536,537,541,548,552,556,557,564,565,574,579,586,591,594,599]};
for( const cstr in MERIDIAN_COLOURED ) {
label_nodes(nodes, MERIDIAN_COLOURED[cstr], Number(cstr));
}
//label_nodes(nodes, [313], 6);
}
const nodes = make_120cell_vertices(); const nodes = make_120cell_vertices();
const links = auto_detect_edges(nodes, 4); const links = auto_detect_edges(nodes, 4);
const faces = auto_120cell_faces(links); const faces = auto_120cell_faces(links);
//const dodecas = make_120cell_cells(faces); //const dodecas = make_120cell_cells(faces);
const colours = all_meridians(nodes, links, faces, faces[0], 341); //const colours = all_meridians(nodes, links, faces, faces[0], 341);
console.log(JSON.stringify(colours)); //console.log(JSON.stringify(colours));
// note - all_meridians colours 530 of the 600 vertices - try a simple
// algorithm to see which of the remaining 70 have 4 neighbours labeled and
// fill in the rest that way
// have tried this and they mostly have 3 with some 1s and 2ss