rabbit-ear
Version:
origami design library
60 lines (56 loc) • 2.28 kB
JavaScript
/* 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 };