Faces and stuff
This commit is contained in:
		
							parent
							
								
									7cc7331db1
								
							
						
					
					
						commit
						2f609594e5
					
				@ -281,6 +281,85 @@ function make_120cell_vertices() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// face detection for the 120-cell
 | 
			
		||||
 | 
			
		||||
// NOTE: all of these return node ids, not nodes
 | 
			
		||||
 | 
			
		||||
// return all the links which connect to a node
 | 
			
		||||
 | 
			
		||||
function nodes_links(links, nodeid) {
 | 
			
		||||
	return links.filter((l) => l.source === nodeid || l.target === nodeid);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// filter to remove a link to a given id from a set of links
 | 
			
		||||
 | 
			
		||||
function not_to_this(link, nodeid) {
 | 
			
		||||
	return !(link.source === nodeid || link.target === nodeid);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// given nodes n1, n2, return all neighbours of n2 which are not n1
 | 
			
		||||
 | 
			
		||||
function unmutuals(links, n1id, n2id) {
 | 
			
		||||
	const nlinks = nodes_links(links, n2id).filter((l) => not_to_this(l, n1id));
 | 
			
		||||
	return nlinks.map((l) => {
 | 
			
		||||
		if( l.source === n2id ) {
 | 
			
		||||
			return l.target;
 | 
			
		||||
		} else {
 | 
			
		||||
			return l.source;
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function fingerprint(ids) {
 | 
			
		||||
	const sids = [...ids];
 | 
			
		||||
	sids.sort();
 | 
			
		||||
	return sids.join(',');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function auto_120cell_faces(links) {
 | 
			
		||||
	const faces = [];
 | 
			
		||||
	const seen = {};
 | 
			
		||||
	let id = 1;
 | 
			
		||||
	for( const edge of links ) {
 | 
			
		||||
		const v1 = edge.source;
 | 
			
		||||
		const v2 = edge.target;
 | 
			
		||||
		const n1 = unmutuals(links, v2, v1);
 | 
			
		||||
		const n2 = unmutuals(links, v1, v2);
 | 
			
		||||
		const shared = [];
 | 
			
		||||
		for( const a of n1 ) {
 | 
			
		||||
			const an = unmutuals(links, v1, a);
 | 
			
		||||
			for( const d of n2 ) {
 | 
			
		||||
				const dn = unmutuals(links, v2, d);
 | 
			
		||||
				for( const x of an ) {
 | 
			
		||||
					for( const y of dn ) {
 | 
			
		||||
						if( x == y ) {
 | 
			
		||||
							shared.push([v1, a, x, d, v2])
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if( shared.length !== 3 ) {
 | 
			
		||||
			console.log(`Bad shared faces for ${edge.id} ${v1} ${v2}`);
 | 
			
		||||
		}
 | 
			
		||||
		for( const face of shared ) {
 | 
			
		||||
			const fp = fingerprint(face);
 | 
			
		||||
			if( !seen[fp] ) {
 | 
			
		||||
				faces.push({ id: id, nodes: face });
 | 
			
		||||
				id++;
 | 
			
		||||
				seen[fp] = true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return faces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const cell120 = () => {
 | 
			
		||||
	const nodes  = make_120cell_vertices();
 | 
			
		||||
	const links = auto_detect_edges(nodes, 4);
 | 
			
		||||
@ -362,6 +441,8 @@ const cell600 = () => {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// bad stuff
 | 
			
		||||
 | 
			
		||||
function find_chords(chords, n) {
 | 
			
		||||
	return chords.filter((c) => c[0].id === n.id || c[1].id === n.id);
 | 
			
		||||
}
 | 
			
		||||
@ -661,8 +742,49 @@ function iterate_graph(nodes, links, n, fn) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const nodes = make_120cell_vertices();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// stupid tetrahedral labelling
 | 
			
		||||
// keeps getting stuck
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function naive_label_120cell(nodes, links, n) {
 | 
			
		||||
	const nodes_id = {};
 | 
			
		||||
	nodes.map((n) => nodes_id[n.id] = n);
 | 
			
		||||
	iterate_graph(nodes, links, nodes[0], (n) => {
 | 
			
		||||
		const cols = new Set();
 | 
			
		||||
		const nbors = find_adjacent(links, n.id);
 | 
			
		||||
		for( const nb of nbors ) {
 | 
			
		||||
			if( nodes_id[nb].label > 0 ) {
 | 
			
		||||
				cols.add(nodes_id[nb].label);
 | 
			
		||||
			}
 | 
			
		||||
			for( const nb2 of find_adjacent(links, nb) ) {
 | 
			
		||||
				if( nb2 !== n.id && nodes_id[nb].label > 0 ) {
 | 
			
		||||
					cols.add(nodes_id[nb2].label);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		const pcols = [ 1, 2, 3, 4, 5 ].filter((c) => !cols.has(c));
 | 
			
		||||
		if( pcols.length < 1 ) {
 | 
			
		||||
			console.log(`Got stuck, no options at ${n.id}`);
 | 
			
		||||
			return false;
 | 
			
		||||
		} else {
 | 
			
		||||
			n.label = pcols[0];
 | 
			
		||||
			console.log(`found ${pcols.length} colors for node ${n.id}`);
 | 
			
		||||
			console.log(`applied ${pcols[0]} to node ${n.id}`);
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const nodes = make_120cell_vertices();
 | 
			
		||||
const links = auto_detect_edges(nodes, 4);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -360,6 +360,7 @@ function naive_label_120cell(nodes, links, n) {
 | 
			
		||||
			return false;
 | 
			
		||||
		} else {
 | 
			
		||||
			n.label = pcols[0];
 | 
			
		||||
			console.log(`found ${pcols.length} colors for node ${n.id}`);
 | 
			
		||||
			console.log(`applied ${pcols[0]} to node ${n.id}`);
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
@ -384,7 +385,6 @@ export const cell120 = () => {
 | 
			
		||||
			node_size: 0.02,
 | 
			
		||||
			link_size: 0.02
 | 
			
		||||
		},
 | 
			
		||||
		faces: faces
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user