UNPKG

rabbit-ear

Version:
60 lines (56 loc) 2.28 kB
/* Rabbit Ear 0.9.4 alpha 2024-04-20 (c) Kraft, GNU GPLv3 License */ import { filterKeysWithPrefix } from '../fold/spec.js'; import { uniqueElements } from '../general/array.js'; import { connectedComponents } from './connectedComponents.js'; import { makeVerticesVerticesUnsorted } from './make/verticesVertices.js'; import { makeVerticesEdgesUnsorted } from './make/verticesEdges.js'; import { makeVerticesFacesUnsorted } from './make/verticesFaces.js'; import { invertFlatToArrayMap } from './maps.js'; const disjointGraphsIndices = (graph) => { const edges_vertices = graph.edges_vertices || []; const faces_vertices = graph.faces_vertices || []; const vertices_edges = graph.vertices_edges ? graph.vertices_edges : makeVerticesEdgesUnsorted({ edges_vertices }); const vertices_vertices = graph.vertices_vertices ? graph.vertices_vertices : makeVerticesVerticesUnsorted({ vertices_edges, edges_vertices }); const vertices_faces = graph.vertices_faces ? graph.vertices_faces : makeVerticesFacesUnsorted({ vertices_edges, faces_vertices }); const vertices = invertFlatToArrayMap(connectedComponents(vertices_vertices)); const edges = vertices .map(verts => verts.flatMap(v => vertices_edges[v])) .map(uniqueElements); const faces = vertices .map(verts => verts.flatMap(v => vertices_faces[v])) .map(uniqueElements); return Array.from(Array(vertices.length)).map((_, i) => ({ vertices: vertices[i] || [], edges: edges[i] || [], faces: faces[i] || [], })); }; const disjointGraphs = (graph) => { const graphs = disjointGraphsIndices(graph); const verticesKeys = filterKeysWithPrefix(graph, "vertices"); const edgesKeys = filterKeysWithPrefix(graph, "edges"); const facesKeys = filterKeysWithPrefix(graph, "faces"); return graphs.map(({ vertices, edges, faces }) => { const subgraph = {}; verticesKeys.forEach(key => { subgraph[key] = []; vertices.forEach(v => { subgraph[key][v] = graph[key][v]; }); }); edgesKeys.forEach(key => { subgraph[key] = []; edges.forEach(v => { subgraph[key][v] = graph[key][v]; }); }); facesKeys.forEach(key => { subgraph[key] = []; faces.forEach(v => { subgraph[key][v] = graph[key][v]; }); }); return subgraph; }); }; export { disjointGraphs, disjointGraphsIndices };